摘要:桶排序的基本思路是遍歷一個待排的數(shù)組把每個數(shù)出現(xiàn)的次數(shù)記錄到一個新的數(shù)組里面那這個新的數(shù)組里的下標(biāo)就是待排序的數(shù)組的值設(shè)待排數(shù)組是記錄待排數(shù)組的桶是讓我們來理一下思路新建一個數(shù)組數(shù)組的大小是循環(huán)遍歷這個數(shù)組在循環(huán)體里面將數(shù)出現(xiàn)的次數(shù)記
bucket sort
桶排序的基本思路是遍歷一個待排的數(shù)組,把每個數(shù)出現(xiàn)的次數(shù)記錄到一個新的數(shù)組里面,那這個新的數(shù)組里的下標(biāo)就是待排序的數(shù)組的值.
設(shè)待排數(shù)組是arr,記錄待排數(shù)組的桶是bucket讓我們來理一下思路:
新建一個數(shù)組,數(shù)組的大小是arr.length-1;
循環(huán)遍歷arr這個數(shù)組,在循環(huán)體里面將arr數(shù)出現(xiàn)的次數(shù)記錄到bucket這個數(shù)組里面;
遍歷bucket這個數(shù)組,判斷值是多少就輸出多少次bucket的下標(biāo);
以下是Java代碼:
public static void bucketSort(int [] arr){ int[] bucket=new int[max(arr)+1]; for (int i = 0; i < arr.length; i++) { bucket[arr[i]]++; } int count=0; for (int i=0;i以上只是一個簡單的桶排序,不能排序負(fù)數(shù)和小數(shù),但它的時間復(fù)雜度也僅僅是T(N)=O(N+M);
buble sort冒泡排序的的思路就是遍歷數(shù)組,交換(swap)相鄰兩個元素,使余下未排序數(shù)組部分最大(或最小)的元素浮到最前或最后;
這樣排序一個長度為N的數(shù)組所需要的時間復(fù)雜度T(N)=O(N2)以下是java代碼:
public static void bubbleSort(int [] arr){ for (int i = arr.length; i > 0; i--) { for (int j = 0; j < i-1; j++) { if (arr[j]>arr[j+1]){ swap(arr,j,j+1); } } } }冒泡排序的缺點(diǎn)很明顯,在全部無序的情況下,時間復(fù)雜度太高了(因為它只能交換相鄰兩個元素);
selection sort
而且上述的示例有一個需要改進(jìn)的地方就是:設(shè)想一個數(shù)組前半部分是有序的,但是如果有序的話檢查一次就夠了(前面在排序后半部分的元素中已經(jīng)檢查過了),所以我們可以設(shè)一個布爾型的flag值,有序就直接跳過,這樣能大大縮短代碼運(yùn)行時間;選擇排序和冒泡排序有點(diǎn)類似,它的基本思路就是把數(shù)組看成兩部分:一部分有序,一部分無序;
把后面無序的部分的最小值放到前半部分的最后面(冒泡排序是交換相鄰的元素)以下是java代碼:
public static void selectionSort(int[] arr){ for (int i = 0; i < arr.length; i++) { for (int j = i+1; j < arr.length; j++) { if (arr[j]選擇排序的時間復(fù)雜度也是O(N2)
insertion sort插入排序的基本思路是選擇后面沒排序的部分的第一個元素,插入到前半部分有序的合適位置(和選擇排序正好相反);
讓我們來理一下思路吧:
arr[0]是有序的;
遍歷余下的將arr[1]放到前面有序部分的合適位置(arr[0]前面或后面);
每次把余下部分的第一個放到前面有序的合適位置(重復(fù)1,2步驟);
直到余下的部分沒有元素.
以下是java代碼:
/** * thought the arr as two part, the front part is ordered and the end part is unordered; * in the loop each time put the fist element of the end part to the appropriate position in the front part; * until the outer loop is over; * @param arr the array wait to sort; */ public static void insertionSort(int[] arr){ for (int i = 0; i < arr.length; i++) { for (int j = 0; j < i; j++) { if (arr[i]j; k--) { arr[k]=arr[k-1]; } arr[j]=tmp; break; } } } } 由于有兩層循環(huán),所以它的時間復(fù)雜度也是O(N2),不過和選擇排序不同的是它是穩(wěn)定的排序;
quick sort快速排序采用分治法(divide-and-conquer method),利用遞歸(recursion)對數(shù)組作拆分處理;
分治法的基本思路就是:大事化小,小事化無;讓我們來理一下思路吧:
隨便找一個元素看作基準(zhǔn)點(diǎn)(為了方便起見我們不妨把a(bǔ)rr[0]看作基準(zhǔn)點(diǎn));
基準(zhǔn)點(diǎn)左邊的數(shù)比基準(zhǔn)點(diǎn)小,右邊的數(shù)比它大;
循環(huán)調(diào)用,直到每部分只有兩數(shù),左邊小,右邊大;
java代碼如下:
/** *Quicksort is a divide-and-conquer method for sorting.* divide the arr to two parts, set the leftest element as the standard position; * find the smaller element than standard position from the right; * find the larger element than standard position from the left; * @param arr the arr wait to sort * @param left left guard * @param right right guard */ public static void quickSort(int[] arr,int left,int right){ if (left>right) return; int i=left,j=right,pos=arr[left]; while(i!=j){ while(i=pos){ j--; } while(i 由于快排是跳躍交換元素位置的(和冒泡排序不同),所以它的平均時間復(fù)雜度是O(NlogN);
summary
沒接觸到遞歸的同學(xué)可能覺得快排有點(diǎn)抽象,可以參照<啊哈,算法>或<算法第四版>(實(shí)際上我也在用這兩本教材),你也可以看看發(fā)明者關(guān)于快排的論文;以下是每種算法的平均時間復(fù)雜度:
name T(N) bucket sort O(N+M) buble sort O(N2) selection sort O(N2) insertion sort O(N2) quick sort O(NlogN) 還有其他的希爾排序,堆排序,計數(shù)排序,基數(shù)排序啊有待讀者們?nèi)ヒ灰惶剿?這里就不再一一贅述了.
原文鏈接:<算法第四版>最佳實(shí)踐
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75103.html
摘要:算法描述冒泡排序是一種簡單的排序算法。算法描述和實(shí)現(xiàn)一般來說,插入排序都采用在數(shù)組上實(shí)現(xiàn)。平均情況希爾排序年發(fā)明第一個突破的排序算法是簡單插入排序的改進(jìn)版它與插入排序的不同之處在于,它會優(yōu)先比較距離較遠(yuǎn)的元素。 前言 讀者自行嘗試可以想看源碼戳這,博主在github建了個庫,讀者可以Clone下來本地嘗試。此博文配合源碼體驗更棒哦~~~ 個人博客:Damonare的個人博客 原文地址:...
摘要:我們討論比較排序算法的理論基礎(chǔ),并結(jié)合本章應(yīng)用排序和優(yōu)先級隊列算法。基本排序引入了選擇排序,插入排序和。描述了,一種保證在線性時間內(nèi)運(yùn)行的排序算法。當(dāng)我們后續(xù)實(shí)現(xiàn)排序算法時,我們實(shí)際上將這個機(jī)制隱藏在我們的實(shí)現(xiàn)下面。 前言 上一篇:棧和隊列下一篇:歸并排序 排序是重新排列一系列對象以便按照某種邏輯順序排列的過程。排序在商業(yè)數(shù)據(jù)處理和現(xiàn)代科學(xué)計算中起著重要作用。在交易處理,組合優(yōu)化,天體...
摘要:向后移動位簡單選擇排序基本思想常用于取序列中最大最小的幾個數(shù)時。代碼實(shí)現(xiàn)循環(huán)次數(shù)選出最小的值和位置交換位置堆排序基本思想對簡單選擇排序的優(yōu)化。 概述 常見的八大排序算法,它們之間的關(guān)系如下: showImg(https://segmentfault.com/img/remote/1460000011395738?w=880&h=671); 直接插入排序 希爾排序 簡單選擇排序 堆排序...
摘要:一常見的排序算法及時間復(fù)雜度二各排序算法的理解及實(shí)現(xiàn)冒泡排序算法描述比較相鄰元素,如果第一個比第二個大,交換位置,這樣每經(jīng)過一趟就冒出一個最大的動圖演示代碼實(shí)現(xiàn)快速排序算法描述從數(shù)列中挑出一個元素,稱為基準(zhǔn)從左向右找比這個第一個比這個基 一.常見的排序算法及時間復(fù)雜度 showImg(https://segmentfault.com/img/bV8J6j?w=1722&h=1132);...
摘要:排序算法索引待更數(shù)據(jù)結(jié)構(gòu)與算法桶排序數(shù)據(jù)結(jié)構(gòu)與算法快速排序時間復(fù)雜度算法的時間復(fù)雜度是一個函數(shù),其定量的描述了一個算法運(yùn)行時間和輸入規(guī)模之間的關(guān)系??偨Y(jié)在介紹排序算法之前,本篇先對后面排序算法的基本概念說叨說叨,打下一個基礎(chǔ)鋪墊。 聲明:碼字不易,轉(zhuǎn)載請注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時更新,歡迎各位讀者監(jiān)督。在介紹各類排序算法之前,本篇先聊聊算...
閱讀 3181·2023-04-25 19:09
閱讀 3893·2021-10-22 09:54
閱讀 1770·2021-09-29 09:35
閱讀 2925·2021-09-08 09:45
閱讀 2270·2021-09-06 15:00
閱讀 2781·2019-08-29 15:32
閱讀 1046·2019-08-28 18:30
閱讀 382·2019-08-26 13:43