色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

十大經典排序算法動畫與解析

電子工程師 ? 來源:lq ? 2019-02-25 09:20 ? 次閱讀

排序算法是《數據結構與算法》中最基本的算法之一。

排序算法可以分為內部排序和外部排序。內部排序是數據記錄在內存中進行排序。而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。

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

用一張圖概括:

時間復雜度與空間復雜度

關于時間復雜度:

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

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

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

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

關于穩定性:

穩定的排序算法:冒泡排序、插入排序、歸并排序和基數排序;

不是穩定的排序算法:選擇排序、快速排序、希爾排序、堆排序。

一、冒泡排序

1.1 算法步驟

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

對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對。這步做完后,最后的元素會是最大的數。

針對所有的元素重復以上的步驟,除了最后一個。

持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

1.2 動畫演示

冒泡排序動畫演示

1.3 參考代碼

1//Java代碼實現 2publicclassBubbleSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對arr進行拷貝,不改變參數內容 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 算法步驟

首先在未排序序列中找到最?。ù螅┰?,存放到排序序列的起始位置

再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。

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

2.2 動畫演示

選擇排序動畫演示

2.3 參考代碼

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

三、插入排序

3.1 算法步驟

將第一待排序序列第一個元素看做一個有序序列,把第二個元素到最后一個元素當成是未排序序列。

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

3.2 動畫演示

插入排序動畫演示

3.3 參考代碼

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

四、希爾排序

4.1 算法步驟

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

按增量序列個數 k,對序列進行 k 趟排序;

每趟排序,根據對應的增量 ti,將待排序列分割成若干長度為 m 的子序列,分別對各子表進行直接插入排序。僅增量因子為 1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。

4.2 動畫演示

希爾排序動畫演示

4.3 參考代碼

1//Java代碼實現 2publicclassShellSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對arr進行拷貝,不改變參數內容 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 算法步驟

申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合并后的序列;

設定兩個指針,最初位置分別為兩個已經排序序列的起始位置;

比較兩個指針所指向的元素,選擇相對小的元素放入到合并空間,并移動指針到下一位置;

重復步驟 3 直到某一指針達到序列尾;

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

5.2 動畫演示

歸并排序動畫演示

5.3 參考代碼

1//Java代碼實現 publicclassMergeSortimplementsIArraySort{ 2 3@Override 4publicint[]sort(int[]sourceArray)throwsException{ 5//對arr進行拷貝,不改變參數內容 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}

六、快速排序

算法步驟

從數列中挑出一個元素,稱為 “基準”(pivot);

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

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

6.2 動畫演示

快速排序動畫演示

6.3 參考代碼

1//Java代碼實現 2publicclassQuickSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對arr進行拷貝,不改變參數內容 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 算法步驟

創建一個堆 H[0……n-1];

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

把堆的尺寸縮小 1,并調用 shift_down(0),目的是把新的數組頂端數據調整到相應位置;

重復步驟 2,直到堆的尺寸為 1。

7.2 動畫演示

堆排序動畫演示

7.3 參考代碼

1//Java代碼實現 2publicclassHeapSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對arr進行拷貝,不改變參數內容 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}

八、計數排序

8.1 算法步驟

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

開辟一塊新的空間創建新的數組 B,長度為 ( max - min + 1)

數組 B 中 index 的元素記錄的值是 A 中某元素出現的次數

最后輸出目標整數序列,具體的邏輯是遍歷數組 B,輸出相應元素以及對應的個數

8.2 動畫演示

計數排序動畫演示

8.3 參考代碼

1//Java代碼實現 2publicclassCountingSortimplementsIArraySort{ 3 4@Override 5publicint[]sort(int[]sourceArray)throwsException{ 6//對arr進行拷貝,不改變參數內容 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 算法步驟

設置固定數量的空桶。

把數據放到對應的桶中。

對每個不為空的桶中數據進行排序。

拼接不為空的桶中數據,得到結果

9.2 動畫演示

桶排序動畫演示

9.3 參考代碼

1//Java代碼實現 2publicclassBucketSortimplementsIArraySort{ 3 4privatestaticfinalInsertSortinsertSort=newInsertSort(); 5 6@Override 7publicint[]sort(int[]sourceArray)throwsException{ 8//對arr進行拷貝,不改變參數內容 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//利用映射函數將數據分配到各個桶中33for(inti=0;i

十、基數排序

10.1 算法步驟

將所有待比較數值(正整數)統一為同樣的數位長度,數位較短的數前面補零

從最低位開始,依次進行一次排序

從最低位排序一直到最高位排序完成以后, 數列就變成一個有序序列

10.2 動畫演示

基數排序動畫演示

10.3 參考代碼

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4790

    瀏覽量

    68649
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40136
  • 排序算法
    +關注

    關注

    0

    文章

    52

    瀏覽量

    10062

原文標題:十大經典排序算法動畫與解析,看我就夠了

文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    動圖展示C語言十大經典排序算法

    以前也零零碎碎發過一些排序算法,但排版都不太好,又重新整理一次,排序算法是數據結構的重要部分,系統地學習很有必要。
    發表于 11-08 09:45 ?602次閱讀

    C語言經典排序算法總結

    本文將通過動態演示+代碼的形式系統地總結十大經典排序算法
    發表于 06-05 10:56 ?543次閱讀
    C語言<b class='flag-5'>經典</b><b class='flag-5'>排序</b><b class='flag-5'>算法</b>總結

    C語言實現十大經典排序算法

    比較類排序:通過比較來決定元素間的相對次序,由于其時間復雜度不能突破O(nlogn),因此也稱為非線性時間比較類排序。
    發表于 06-25 10:23 ?407次閱讀
    C語言實現<b class='flag-5'>十大經典</b><b class='flag-5'>排序</b><b class='flag-5'>算法</b>

    十大排序算法總結

    排序算法是最經典算法知識。因為其實現代碼短,應該廣,在面試中經常會問到排序算法及其相關的問題。
    的頭像 發表于 12-20 10:39 ?1127次閱讀

    數據挖掘十大經典算法,你都知道哪些!

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

    單片機濾波算法

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

    電池管理中的十大經典理論

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

    數學建模十大經典算法

    電子專業單片機相關知識學習教材資料——數學建模十大經典算法
    發表于 08-08 18:20 ?0次下載

    數據挖掘十大經典算法,你都知道哪些!

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

    NI獲選第八屆浦東總部經濟十大經典樣本,持續助力中國科技創新和產業發展

    由上海市浦東新區商務委員會主辦的第八屆浦東總部經濟十大經典樣本發布活動在上海舉行。NI成功獲選2022年十大經典樣本,以生動案例和具體實踐,充分展示NI中國在行業引領性、全球資源配置功能、科技創新能力等方面的成就。
    的頭像 發表于 12-01 11:46 ?1207次閱讀

    C語言動圖演示十大經典排序算法(含代碼)

    本文將通過動態演示+代碼的形式系統地總結十大經典排序算法
    的頭像 發表于 01-29 11:34 ?1321次閱讀

    動圖演示C語言10大經典排序算法(含代碼)

    本文將通過 動態演示+代碼 的形式系統地總結十大經典排序算法排序算法 算法分類
    的頭像 發表于 02-07 01:24 ?743次閱讀

    用Python實現十大經典排序算法(附動圖)

    冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要
    的頭像 發表于 03-13 09:29 ?1942次閱讀

    常見排序算法分類

    本文將通過動態演示+代碼的形式系統地總結十大經典排序算法。 排序算法 算法分類 ——
    的頭像 發表于 06-22 14:49 ?919次閱讀
    常見<b class='flag-5'>排序</b><b class='flag-5'>算法</b>分類

    機器學習的基本流程和十大算法

    為了進行機器學習和數據挖掘任務,數據科學家們提出了各種模型,在眾多的數據挖掘模型中,國際權威的學術組織 ICDM(the IEEE International Conference on Data Mining)評選出了十大經典算法。
    發表于 10-31 11:30 ?1022次閱讀
    機器學習的基本流程和<b class='flag-5'>十大</b><b class='flag-5'>算法</b>
    主站蜘蛛池模板: 国内精品久久| 日本黄色官网| 恋夜影院安卓免费列表uc| 男女亲吻摸下面吃奶视频| 日韩精品一卡二卡三卡四卡2021 | 久久中文字幕无线观看| 欧美猛男gaygayxxgv| 亚洲m男在线中文字幕| 2021年国产精品久久| 国产69精品久久久熟女 | 出租屋自拍贵在真实15P| 国产在线观看91精品| 嫩草影院久久精品| 亚洲国产成人精品无码区APP | 亚洲精品国产SUV| 99久久精品国产自免费| 国产亚洲精品AV麻豆狂野| 暖暖 免费 日本 高清 在线1| 无码AV精品一区二区三区| 2021国产精品国产精华| 国产日韩精品SUV| 欧美GAY猛男GAYA片18禁| 亚洲国产成人久久一区www妖精| FREEHDXXXX学生妹| 精品视频中文字幕| 少妇伦子伦精品无码| 18 japanese宾馆直播| 国产精品高清m3u8在线播放| 免费国产久久啪在线| 亚洲国产黄色| www.三级| 久久视热频这里只精品| 午夜国产精品免费观看| cctv官网| 久久久久国产一级毛片高清片| 外女思春台湾三级| 99re.05久久热最新地址| 好好的曰com久久| 手机在线播放成人亚洲影院电影| 999在线观看精品免费| 久久精品伊人|