0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

十大經(jīng)典排序算法動(dòng)畫與解析

電子工程師 ? 來(lái)源:lq ? 2019-02-25 09:20 ? 次閱讀

排序算法是《數(shù)據(jù)結(jié)構(gòu)與算法》中最基本的算法之一。

排序算法可以分為內(nèi)部排序和外部排序。內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序。而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的排序記錄,在排序過(guò)程中需要訪問(wèn)外存。

常見的內(nèi)部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸并排序、快速排序、堆排序、基數(shù)排序等。

用一張圖概括:

時(shí)間復(fù)雜度與空間復(fù)雜度

關(guān)于時(shí)間復(fù)雜度:

平方階 (O(n2)) 排序 各類簡(jiǎn)單排序:直接插入、直接選擇和冒泡排序;

線性對(duì)數(shù)階 (O(nlog2n)) 排序 快速排序、堆排序和歸并排序;

O(n1+§)) 排序,§ 是介于 0 和 1 之間的常數(shù)。 希爾排序;

線性階 (O(n)) 排序 基數(shù)排序,此外還有桶、箱排序。

關(guān)于穩(wěn)定性:

穩(wěn)定的排序算法:冒泡排序、插入排序、歸并排序和基數(shù)排序;

不是穩(wěn)定的排序算法:選擇排序、快速排序、希爾排序、堆排序。

一、冒泡排序

1.1 算法步驟

比較相鄰的元素。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)。

對(duì)每一對(duì)相鄰元素作同樣的工作,從開始第一對(duì)到結(jié)尾的最后一對(duì)。這步做完后,最后的元素會(huì)是最大的數(shù)。

針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)。

持續(xù)每次對(duì)越來(lái)越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較。

1.2 動(dòng)畫演示

冒泡排序動(dòng)畫演示

1.3 參考代碼

1//Java代碼實(shí)現(xiàn) 2publicclassBubbleSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對(duì)arr進(jìn)行拷貝,不改變參數(shù)內(nèi)容 7int[]arr=Arrays.copyOf(sourceArray,sourceArray.length); 8 9for(inti=1;iarr[j+1]){15inttmp=arr[j];16arr[j]=arr[j+1];17arr[j+1]=tmp;1819flag=false;20}21}2223if(flag){24break;25}26}27returnarr;28}29}

二、選擇排序

2.1 算法步驟

首先在未排序序列中找到最?。ù螅┰兀娣诺脚判蛐蛄械钠鹗嘉恢?/p>

再?gòu)氖S辔磁判蛟刂欣^續(xù)尋找最?。ù螅┰?,然后放到已排序序列的末尾。

重復(fù)第二步,直到所有元素均排序完畢。

2.2 動(dòng)畫演示

選擇排序動(dòng)畫演示

2.3 參考代碼

1//Java代碼實(shí)現(xiàn) 2publicclassSelectionSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6int[]arr=Arrays.copyOf(sourceArray,sourceArray.length); 7 8//總共要經(jīng)過(guò)N-1輪比較 9for(inti=0;i

三、插入排序

3.1 算法步驟

將第一待排序序列第一個(gè)元素看做一個(gè)有序序列,把第二個(gè)元素到最后一個(gè)元素當(dāng)成是未排序序列。

從頭到尾依次掃描未排序序列,將掃描到的每個(gè)元素插入有序序列的適當(dāng)位置。(如果待插入的元素與有序序列中的某個(gè)元素相等,則將待插入元素插入到相等元素的后面。)

3.2 動(dòng)畫演示

插入排序動(dòng)畫演示

3.3 參考代碼

1//Java代碼實(shí)現(xiàn) 2publicclassInsertSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對(duì)arr進(jìn)行拷貝,不改變參數(shù)內(nèi)容 7int[]arr=Arrays.copyOf(sourceArray,sourceArray.length); 8 9//從下標(biāo)為1的元素開始選擇合適的位置插入,因?yàn)橄聵?biāo)為0的只有一個(gè)元素,默認(rèn)是有序的10for(inti=1;i0&&tmp

四、希爾排序

4.1 算法步驟

選擇一個(gè)增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;

按增量序列個(gè)數(shù) k,對(duì)序列進(jìn)行 k 趟排序;

每趟排序,根據(jù)對(duì)應(yīng)的增量 ti,將待排序列分割成若干長(zhǎng)度為 m 的子序列,分別對(duì)各子表進(jìn)行直接插入排序。僅增量因子為 1 時(shí),整個(gè)序列作為一個(gè)表來(lái)處理,表長(zhǎng)度即為整個(gè)序列的長(zhǎng)度。

4.2 動(dòng)畫演示

希爾排序動(dòng)畫演示

4.3 參考代碼

1//Java代碼實(shí)現(xiàn) 2publicclassShellSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對(duì)arr進(jìn)行拷貝,不改變參數(shù)內(nèi)容 7int[]arr=Arrays.copyOf(sourceArray,sourceArray.length); 8 9intgap=1;10while(gap0){15for(inti=gap;i=0&&arr[j]>tmp){19arr[j+gap]=arr[j];20j-=gap;21}22arr[j+gap]=tmp;23}24gap=(int)Math.floor(gap/3);25}2627returnarr;28}29}

五、歸并排序

5.1 算法步驟

申請(qǐng)空間,使其大小為兩個(gè)已經(jīng)排序序列之和,該空間用來(lái)存放合并后的序列;

設(shè)定兩個(gè)指針,最初位置分別為兩個(gè)已經(jīng)排序序列的起始位置;

比較兩個(gè)指針?biāo)赶虻脑?,選擇相對(duì)小的元素放入到合并空間,并移動(dòng)指針到下一位置;

重復(fù)步驟 3 直到某一指針達(dá)到序列尾;

將另一序列剩下的所有元素直接復(fù)制到合并序列尾。

5.2 動(dòng)畫演示

歸并排序動(dòng)畫演示

5.3 參考代碼

1//Java代碼實(shí)現(xiàn) publicclassMergeSortimplementsIArraySort{ 2 3@Override 4publicint[]sort(int[]sourceArray)throwsException{ 5//對(duì)arr進(jìn)行拷貝,不改變參數(shù)內(nèi)容 6int[]arr=Arrays.copyOf(sourceArray,sourceArray.length); 7 8if(arr.length0&&right.length>0){23if(left[0]<=?right[0])?{24????????????????result[i++]?=?left[0];25????????????????left?=?Arrays.copyOfRange(left,?1,?left.length);26????????????}?else?{27????????????????result[i++]?=?right[0];28????????????????right?=?Arrays.copyOfRange(right,?1,?right.length);29????????????}30????????}3132????????while?(left.length?>0){33result[i++]=left[0];34left=Arrays.copyOfRange(left,1,left.length);35}3637while(right.length>0){38result[i++]=right[0];39right=Arrays.copyOfRange(right,1,right.length);40}4142returnresult;43}4445}

六、快速排序

算法步驟

從數(shù)列中挑出一個(gè)元素,稱為 “基準(zhǔn)”(pivot);

重新排序數(shù)列,所有元素比基準(zhǔn)值小的擺放在基準(zhǔn)前面,所有元素比基準(zhǔn)值大的擺在基準(zhǔn)的后面(相同的數(shù)可以到任一邊)。在這個(gè)分區(qū)退出之后,該基準(zhǔn)就處于數(shù)列的中間位置。這個(gè)稱為分區(qū)(partition)操作;

遞歸地(recursive)把小于基準(zhǔn)值元素的子數(shù)列和大于基準(zhǔn)值元素的子數(shù)列排序。

6.2 動(dòng)畫演示

快速排序動(dòng)畫演示

6.3 參考代碼

1//Java代碼實(shí)現(xiàn) 2publicclassQuickSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對(duì)arr進(jìn)行拷貝,不改變參數(shù)內(nèi)容 7int[]arr=Arrays.copyOf(sourceArray,sourceArray.length); 8 9returnquickSort(arr,0,arr.length-1);10}1112privateint[]quickSort(int[]arr,intleft,intright){13if(left

七、堆排序

7.1 算法步驟

創(chuàng)建一個(gè)堆 H[0……n-1];

把堆首(最大值)和堆尾互換;

把堆的尺寸縮小 1,并調(diào)用 shift_down(0),目的是把新的數(shù)組頂端數(shù)據(jù)調(diào)整到相應(yīng)位置;

重復(fù)步驟 2,直到堆的尺寸為 1。

7.2 動(dòng)畫演示

堆排序動(dòng)畫演示

7.3 參考代碼

1//Java代碼實(shí)現(xiàn) 2publicclassHeapSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對(duì)arr進(jìn)行拷貝,不改變參數(shù)內(nèi)容 7int[]arr=Arrays.copyOf(sourceArray,sourceArray.length); 8 9intlen=arr.length;1011buildMaxHeap(arr,len);1213for(inti=len-1;i>0;i--){14swap(arr,0,i);15len--;16heapify(arr,0,len);17}18returnarr;19}2021privatevoidbuildMaxHeap(int[]arr,intlen){22for(inti=(int)Math.floor(len/2);i>=0;i--){23heapify(arr,i,len);24}25}2627privatevoidheapify(int[]arr,inti,intlen){28intleft=2*i+1;29intright=2*i+2;30intlargest=i;3132if(leftarr[largest]){33largest=left;34}3536if(rightarr[largest]){37largest=right;38}3940if(largest!=i){41swap(arr,i,largest);42heapify(arr,largest,len);43}44}4546privatevoidswap(int[]arr,inti,intj){47inttemp=arr[i];48arr[i]=arr[j];49arr[j]=temp;50}5152}

八、計(jì)數(shù)排序

8.1 算法步驟

花O(n)的時(shí)間掃描一下整個(gè)序列 A,獲取最小值 min 和最大值 max

開辟一塊新的空間創(chuàng)建新的數(shù)組 B,長(zhǎng)度為 ( max - min + 1)

數(shù)組 B 中 index 的元素記錄的值是 A 中某元素出現(xiàn)的次數(shù)

最后輸出目標(biāo)整數(shù)序列,具體的邏輯是遍歷數(shù)組 B,輸出相應(yīng)元素以及對(duì)應(yīng)的個(gè)數(shù)

8.2 動(dòng)畫演示

計(jì)數(shù)排序動(dòng)畫演示

8.3 參考代碼

1//Java代碼實(shí)現(xiàn) 2publicclassCountingSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對(duì)arr進(jìn)行拷貝,不改變參數(shù)內(nèi)容 7int[]arr=Arrays.copyOf(sourceArray,sourceArray.length); 8 9intmaxValue=getMaxValue(arr);1011returncountingSort(arr,maxValue);12}1314privateint[]countingSort(int[]arr,intmaxValue){15intbucketLen=maxValue+1;16int[]bucket=newint[bucketLen];1718for(intvalue:arr){19bucket[value]++;20}2122intsortedIndex=0;23for(intj=0;j0){25arr[sortedIndex++]=j;26bucket[j]--;27}28}29returnarr;30}3132privateintgetMaxValue(int[]arr){33intmaxValue=arr[0];34for(intvalue:arr){35if(maxValue

九、桶排序

9.1 算法步驟

設(shè)置固定數(shù)量的空桶。

把數(shù)據(jù)放到對(duì)應(yīng)的桶中。

對(duì)每個(gè)不為空的桶中數(shù)據(jù)進(jìn)行排序。

拼接不為空的桶中數(shù)據(jù),得到結(jié)果

9.2 動(dòng)畫演示

桶排序動(dòng)畫演示

9.3 參考代碼

1//Java代碼實(shí)現(xiàn) 2publicclassBucketSortimplementsIArraySort{ 3 4privatestaticfinalInsertSortinsertSort=newInsertSort(); 5 6@Override 7publicint[]sort(int[]sourceArray)throwsException{ 8//對(duì)arr進(jìn)行拷貝,不改變參數(shù)內(nèi)容 9int[]arr=Arrays.copyOf(sourceArray,sourceArray.length);1011returnbucketSort(arr,5);12}1314privateint[]bucketSort(int[]arr,intbucketSize)throwsException{15if(arr.length==0){16returnarr;17}1819intminValue=arr[0];20intmaxValue=arr[0];21for(intvalue:arr){22if(valuemaxValue){25maxValue=value;26}27}2829intbucketCount=(int)Math.floor((maxValue-minValue)/bucketSize)+1;30int[][]buckets=newint[bucketCount][0];3132//利用映射函數(shù)將數(shù)據(jù)分配到各個(gè)桶中33for(inti=0;i

十、基數(shù)排序

10.1 算法步驟

將所有待比較數(shù)值(正整數(shù))統(tǒng)一為同樣的數(shù)位長(zhǎng)度,數(shù)位較短的數(shù)前面補(bǔ)零

從最低位開始,依次進(jìn)行一次排序

從最低位排序一直到最高位排序完成以后, 數(shù)列就變成一個(gè)有序序列

10.2 動(dòng)畫演示

基數(shù)排序動(dòng)畫演示

10.3 參考代碼

1//Java代碼實(shí)現(xiàn) 2publicclassRadixSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對(duì)arr進(jìn)行拷貝,不改變參數(shù)內(nèi)容 7int[]arr=Arrays.copyOf(sourceArray,sourceArray.length); 8 9intmaxDigit=getMaxDigit(arr);10returnradixSort(arr,maxDigit);11}1213/**14*獲取最高位數(shù)15*/16privateintgetMaxDigit(int[]arr){17intmaxValue=getMaxValue(arr);18returngetNumLenght(maxValue);19}2021privateintgetMaxValue(int[]arr){22intmaxValue=arr[0];23for(intvalue:arr){24if(maxValue

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4697

    瀏覽量

    68091
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    569

    瀏覽量

    40063
  • 排序算法
    +關(guān)注

    關(guān)注

    0

    文章

    52

    瀏覽量

    10045

原文標(biāo)題:十大經(jīng)典排序算法動(dòng)畫與解析,看我就夠了

文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    動(dòng)圖展示C語(yǔ)言十大經(jīng)典排序算法

    以前也零零碎碎發(fā)過(guò)一些排序算法,但排版都不太好,又重新整理一次,排序算法是數(shù)據(jù)結(jié)構(gòu)的重要部分,系統(tǒng)地學(xué)習(xí)很有必要。
    發(fā)表于 11-08 09:45 ?562次閱讀

    C語(yǔ)言經(jīng)典排序算法總結(jié)

    本文將通過(guò)動(dòng)態(tài)演示+代碼的形式系統(tǒng)地總結(jié)十大經(jīng)典排序算法
    發(fā)表于 06-05 10:56 ?493次閱讀
    C語(yǔ)言<b class='flag-5'>經(jīng)典</b><b class='flag-5'>排序</b><b class='flag-5'>算法</b>總結(jié)

    C語(yǔ)言實(shí)現(xiàn)十大經(jīng)典排序算法

    比較類排序:通過(guò)比較來(lái)決定元素間的相對(duì)次序,由于其時(shí)間復(fù)雜度不能突破O(nlogn),因此也稱為非線性時(shí)間比較類排序。
    發(fā)表于 06-25 10:23 ?343次閱讀
    C語(yǔ)言實(shí)現(xiàn)<b class='flag-5'>十大經(jīng)典</b><b class='flag-5'>排序</b><b class='flag-5'>算法</b>

    十大排序算法總結(jié)

    排序算法是最經(jīng)典算法知識(shí)。因?yàn)槠鋵?shí)現(xiàn)代碼短,應(yīng)該廣,在面試中經(jīng)常會(huì)問(wèn)到排序算法及其相關(guān)的問(wèn)題。
    的頭像 發(fā)表于 12-20 10:39 ?1048次閱讀

    數(shù)據(jù)挖掘十大經(jīng)典算法,你都知道哪些!

    的所有需求。而這三類里又包含許多經(jīng)典算法。而今天,小編就給大家介紹下數(shù)據(jù)挖掘中最經(jīng)典十大算法,希望它對(duì)你有所幫助。一、 分類決策樹
    發(fā)表于 11-06 17:02

    單片機(jī)濾波算法

    為什么別人的單片機(jī)算法不是百度里面的什么十大經(jīng)典算法二十很復(fù)雜的算法,誰(shuí)能提供一個(gè)算法應(yīng)用在嵌入式里濾ad采樣 溫度這些
    發(fā)表于 03-12 17:05

    電池管理中的十大經(jīng)典理論

    電池管理中的十大經(jīng)典理論 1、彼得原理      每個(gè)組織都是由各種不同的職位、等級(jí)或階層的排列所組成,每個(gè)人都隸屬于
    發(fā)表于 11-06 15:43 ?778次閱讀

    數(shù)學(xué)建模十大經(jīng)典算法

    電子專業(yè)單片機(jī)相關(guān)知識(shí)學(xué)習(xí)教材資料——數(shù)學(xué)建模十大經(jīng)典算法
    發(fā)表于 08-08 18:20 ?0次下載

    數(shù)據(jù)挖掘十大經(jīng)典算法,你都知道哪些!

    的所有需求。而這三類里又包含許多經(jīng)典算法。而今天,小編就給大家介紹下數(shù)據(jù)挖掘中最經(jīng)典十大算法,希望它對(duì)你有所幫助。?圖1.jpg?(1.8
    發(fā)表于 11-06 17:07 ?2w次閱讀

    NI獲選第八屆浦東總部經(jīng)濟(jì)十大經(jīng)典樣本,持續(xù)助力中國(guó)科技創(chuàng)新和產(chǎn)業(yè)發(fā)展

    由上海市浦東新區(qū)商務(wù)委員會(huì)主辦的第八屆浦東總部經(jīng)濟(jì)十大經(jīng)典樣本發(fā)布活動(dòng)在上海舉行。NI成功獲選2022年十大經(jīng)典樣本,以生動(dòng)案例和具體實(shí)踐,充分展示NI中國(guó)在行業(yè)引領(lǐng)性、全球資源配置功能、科技創(chuàng)新能力等方面的成就。
    的頭像 發(fā)表于 12-01 11:46 ?1132次閱讀

    C語(yǔ)言動(dòng)圖演示十大經(jīng)典排序算法(含代碼)

    本文將通過(guò)動(dòng)態(tài)演示+代碼的形式系統(tǒng)地總結(jié)十大經(jīng)典排序算法。
    的頭像 發(fā)表于 01-29 11:34 ?1251次閱讀

    動(dòng)圖演示C語(yǔ)言10大經(jīng)典排序算法(含代碼)

    本文將通過(guò) 動(dòng)態(tài)演示+代碼 的形式系統(tǒng)地總結(jié)十大經(jīng)典排序算法。 排序算法 算法分類
    的頭像 發(fā)表于 02-07 01:24 ?654次閱讀

    用Python實(shí)現(xiàn)十大經(jīng)典排序算法(附動(dòng)圖)

    冒泡排序(Bubble Sort)也是一種簡(jiǎn)單直觀的排序算法。它重復(fù)地走訪過(guò)要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過(guò)來(lái)。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要
    的頭像 發(fā)表于 03-13 09:29 ?1889次閱讀

    常見排序算法分類

    本文將通過(guò)動(dòng)態(tài)演示+代碼的形式系統(tǒng)地總結(jié)十大經(jīng)典排序算法。 排序算法 算法分類 ——
    的頭像 發(fā)表于 06-22 14:49 ?854次閱讀
    常見<b class='flag-5'>排序</b><b class='flag-5'>算法</b>分類

    機(jī)器學(xué)習(xí)的基本流程和十大算法

    為了進(jìn)行機(jī)器學(xué)習(xí)和數(shù)據(jù)挖掘任務(wù),數(shù)據(jù)科學(xué)家們提出了各種模型,在眾多的數(shù)據(jù)挖掘模型中,國(guó)際權(quán)威的學(xué)術(shù)組織 ICDM(the IEEE International Conference on Data Mining)評(píng)選出了十大經(jīng)典算法。
    發(fā)表于 10-31 11:30 ?928次閱讀
    機(jī)器學(xué)習(xí)的基本流程和<b class='flag-5'>十大</b><b class='flag-5'>算法</b>