成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

排序之八大絕技

Vixb / 3636人閱讀

摘要:需要注意的是排升序要建大堆,排降序建小堆。應(yīng)用場(chǎng)景需要前個(gè)最大或最小元素時(shí),或者與其他排序一塊使用五冒泡排序排序思想大的元素向下沉,小的元素向上浮。

目錄

一.插入排序

1.插入排序思想

2.動(dòng)態(tài)圖形演示

?3.插排思路與圖解

4.插入排序代碼實(shí)現(xiàn)(升序)

5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性

6.應(yīng)用場(chǎng)景

二.希爾排序

1.引言

2.希爾排序思想

3.希爾排序動(dòng)圖

4.希爾排序思路圖解

??5.代碼實(shí)現(xiàn)

?6.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性分析

7.應(yīng)用場(chǎng)景

三.選擇排序(升序)

1.排序思想

2.選擇排序動(dòng)態(tài)圖示

3.思路圖解

?4.代碼實(shí)現(xiàn)

5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性分析

6.應(yīng)用場(chǎng)景

四.堆排序

1.堆排序的排序思想

2.堆排序動(dòng)圖演示

?3.思路圖解及代碼實(shí)現(xiàn)

4.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性

5.應(yīng)用場(chǎng)景

五.冒泡排序

1.排序思想

2.冒泡排序動(dòng)圖演示

3.冒泡排序圖解

4.冒泡排序代碼:

?5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性

6.應(yīng)用場(chǎng)景

六.快速排序

1.快速排序思想

2.快速排序動(dòng)圖演示

?3.思路圖解

5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性分析

6.應(yīng)用場(chǎng)景

七.歸并排序

1.歸并思想

2.歸并排序動(dòng)圖演示

?3.實(shí)現(xiàn)歸并的思路圖解

4.代碼實(shí)現(xiàn)

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

1.排序思想

2.應(yīng)用場(chǎng)景

3,思路圖解?

?4.代碼實(shí)現(xiàn)

5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性

6.應(yīng)用場(chǎng)景


一.插入排序

1.插入排序思想

就是將待排序的數(shù)字插入到已經(jīng)排序好的指定位置即可,直到所有需要排序的數(shù)字都插入到序列即可,從而得到一個(gè)有序的序列。(相當(dāng)于我們平常玩撲克牌時(shí)將接到的牌插入到指定的位置)

2.動(dòng)態(tài)圖形演示
?

?3.插排思路與圖解

4.插入排序代碼實(shí)現(xiàn)(升序)

(1)控制排序的次數(shù),保存需要插入的值。

(2)將大的元素向后移,找到合適的位置。

(3)將元素插入指定位置,然后繼續(xù)執(zhí)行上述操作。

(4)這里需要注意在找的時(shí)候可能會(huì)到最前面,需要注意數(shù)組越界問題。

代碼實(shí)現(xiàn):

//插入排序(升序)    public static void insertSort(int[] arr){        //排序的次數(shù)        for(int i=1;i=0 && arr[k]>end){//尋找需要插入的位置                arr[k+1]=arr[k];                k--;            }            arr[k+1]=end;//將元素是插入到指定的位置        }    }

5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性

(1)時(shí)間復(fù)雜度:O(N^2)

?(2)空間復(fù)雜度:O(1)

執(zhí)行過程中沒有借助輔助空間。

(3)什么是穩(wěn)定性

(4)穩(wěn)定性:穩(wěn)定?? ? ??

6.應(yīng)用場(chǎng)景

適合于基本有序的數(shù)組或者數(shù)據(jù)量特別小的數(shù)組,因?yàn)榛居行?,那么中間進(jìn)行比較的次數(shù)就會(huì)減少。

二.希爾排序

1.引言

如果需要排序的數(shù)字量特別多而且比較凌亂,而且還需要使用插入排序,這時(shí)候就有了希爾排序。

2.希爾排序思想

先選定一個(gè)合適的距離,然后以該距離為分割長度,依次對(duì)該距離的所有元素進(jìn)行插入排序,然后再縮小這個(gè)距離,直到距離為1時(shí)結(jié)束。

3.希爾排序動(dòng)圖


?

4.希爾排序思路圖解

這里每次對(duì)于gap間距的值為gap=gap/3+1來處理

?5.代碼實(shí)現(xiàn)

 public static void shellSort(int[] arr){        int gap=arr.length;        while(gap>1){            gap= gap/3+1;           for(int i=gap;i=0 && arr[k]>end){                    arr[k+gap]=arr[k];                    k-=gap;                }                arr[k+gap]=end;           }        }    }

?6.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性分析

(1)時(shí)間復(fù)雜度

如果gap選取的不同,則時(shí)間復(fù)雜度就,對(duì)于希爾排序,時(shí)間復(fù)雜度沒有一個(gè)確定的值,當(dāng)前增量法的時(shí)間復(fù)雜度大致為O(N^1.25)到O(1.6N^1.25)之間。

(2)空間復(fù)雜度????????

????????O(1)

(3)穩(wěn)定性分析

由于每次都時(shí)間隔排序,所以不穩(wěn)定

7.應(yīng)用場(chǎng)景

對(duì)于數(shù)據(jù)量特別大,數(shù)字比較凌亂的情況下,而且還需要使用插入排序的情況下,可以使用希爾排序來進(jìn)行處理。

三.選擇排序(升序)

1.排序思想

每次選擇一個(gè)最大的數(shù)放在數(shù)組的末尾(或者每次選擇一個(gè)最下的放在數(shù)組頭,起始位置后移),然后數(shù)組長度-1,接著使用該方法,直到所有的元素排序完成即可。

2.選擇排序動(dòng)態(tài)圖示

3.思路圖解

?4.代碼實(shí)現(xiàn)

    //選擇排序(每次選最大的元素放在數(shù)組末尾)    public static void selectSort(int[] arr){        for(int i=0;i

5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性分析

(1)時(shí)間復(fù)雜度

每一個(gè)元素都與前n-i-1個(gè)元素進(jìn)行比較,所以時(shí)間復(fù)雜度為O(N^2)

(2)空間復(fù)雜度

沒有額外空間的開辟,所以空間復(fù)雜度為O(1)

(3)穩(wěn)定性

由于每次都是間隔進(jìn)行交換,所以相同的元素最后位置可能會(huì)改變,所以不穩(wěn)定。

6.應(yīng)用場(chǎng)景

由于時(shí)間復(fù)雜度不好,平時(shí)應(yīng)應(yīng)用的比較少。

四.堆排序

1.堆排序的排序思想

堆排序)是指利用堆積樹(堆)這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法,它是選擇排序的一種。它是通過堆來進(jìn)行選擇數(shù)據(jù)。需要注意的是排升序要建大堆,排降序建小堆。

2.堆排序動(dòng)圖演示


?

?3.思路圖解及代碼實(shí)現(xiàn)

認(rèn)識(shí)優(yōu)先級(jí)隊(duì)列與堆_小白 菜的博客-CSDN博客

4.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性

(1)時(shí)間復(fù)雜度

因?yàn)槎雅判蛳喈?dāng)于刪除元素,所以刪除需要N次,然后每次向下調(diào)整最壞為二叉樹的層數(shù)為,

所以時(shí)間復(fù)雜度為O(N*)

(2)空間復(fù)雜度

????????O(1)

(3)穩(wěn)定性

?由于間隔進(jìn)行交換,所以不穩(wěn)定。

5.應(yīng)用場(chǎng)景

需要前k個(gè)最大或最小元素時(shí),或者與其他排序一塊使用

五.冒泡排序

1.排序思想

大的元素向下沉,小的元素向上浮。

2.冒泡排序動(dòng)圖演示

3.冒泡排序圖解

4.冒泡排序代碼:

    //冒泡排序    public static void bubbleSort(int[] arr){        //冒泡的趟數(shù)        for(int i=0;iarr[j+1]){                    swap(arr,j,j+1);//交換2個(gè)元素                    flag=true;                }            }            //沒有再進(jìn)行交換則退出            if(!flag){                return;            }        }    }   public static void swap(int[] arr,int left,int right){        int tmp=arr[left];        arr[left]=arr[right];        arr[right]=tmp;    }

?5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性

(1)時(shí)間復(fù)雜度

O(N^2)

(2)空間復(fù)雜度

O(1)

(3)穩(wěn)定性

沒有間隔進(jìn)行交換,所以穩(wěn)定

6.應(yīng)用場(chǎng)景

基本不使用

六.快速排序

1.快速排序思想

任取待排序元素序列中的某元素作為基準(zhǔn)值,按照該排序碼將待排序集合分割成兩子序列,左子序列中所有元素均小于基準(zhǔn)值,右子序列中所有元素均大于基準(zhǔn)值,然后最左右子序列重復(fù)該過程,直到所有元素都排列在相應(yīng)位置上為止。

原理:以基準(zhǔn)值為中心,將區(qū)間劃分為左邊的值都小于基準(zhǔn)值,右邊的值都大于基準(zhǔn)值,直到所有元素有序即可。

2.快速排序動(dòng)圖演示

?3.思路圖解

?

?

?4.代碼實(shí)現(xiàn)

如果遞歸深度過深,我們可以對(duì)遞歸到小區(qū)間的時(shí)候使用插入排序,這樣可以提高排序速度,這樣也是對(duì)快排進(jìn)行優(yōu)化。

//使用三數(shù)取中法選擇合適基準(zhǔn)值,對(duì)快排優(yōu)化    public static int midDiv(int[] arr,int left,int right){        int mid = left+(right-left)>>1;        //在左右值比較后然后中間值與左右進(jìn)行比較        if(arr[left]arr[right-1]){                return right-1;            }else{                return mid;            }        }else {//左大右小            if(arr[mid]arr[left]){                return left;            }else {                return mid;            }        }    }//前后指針法,劃分區(qū)間,得到基準(zhǔn)值    public static int partiton(int[] arr,int left,int right){        int prev=left-1;        int cur = left;        int midDiv=midDiv(arr,left,right);//找合適基準(zhǔn)值的位置        swap(arr,midDiv,right-1);//基準(zhǔn)值位置與最后元素交換        int div = arr[right-1];        while(cur1){                int div = partiton(arr,left,right);//找基準(zhǔn)值劃分區(qū)間                //左[left,val)                quickSort(arr,left,div);                //右[val+1,right)                quickSort(arr,div+1,right);            }

5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性分析

(1)時(shí)間復(fù)雜度

注意:對(duì)于未選擇三數(shù)取中的方法時(shí),最壞的時(shí)間復(fù)雜度為O(N^2),這是因?yàn)榭赡苊看蝿澐值臅r(shí)候左邊的都比最后一個(gè)小,相當(dāng)于每次只能排好一個(gè),每一個(gè)需要的時(shí)間大概為N,共有N個(gè)元素,所以為O(N^2),但是當(dāng)每次最后一個(gè)數(shù)都為中間值的時(shí)候,時(shí)間復(fù)雜度就變?yōu)镺(*N),為遞歸的深度。

通過優(yōu)化后最終得到的時(shí)間復(fù)雜度為O(*N)

(2)空間復(fù)雜度

在遞歸的時(shí)候借助了輔助空間,空間復(fù)雜度為遞歸的深度,所以空間復(fù)雜度為O()。

(3)穩(wěn)定性

間隔進(jìn)行了交換,所以不穩(wěn)定。

6.應(yīng)用場(chǎng)景

在數(shù)據(jù)特別隨機(jī)的時(shí)候使用快排比較高效

七.歸并排序

1.歸并思想

該算法是采用分治法(Divide andConquer)的一個(gè)非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一個(gè)有序表,稱為二路歸并。

2.歸并排序動(dòng)圖演示

?3.實(shí)現(xiàn)歸并的思路圖解

·

?

?

4.代碼實(shí)現(xiàn)

public static void mergeSort(int[] arr,int left,int right,int[] temp){        if(right-left>1){            int mid = left+((right-left)>>1);//注意優(yōu)先級(jí)問題,否則會(huì)出現(xiàn)棧溢出            //分區(qū)間            mergeSort(arr,left,mid,temp);            mergeSort(arr,mid,right,temp);            //(合區(qū)間)將劃分好的區(qū)間進(jìn)行有序合并            mergeData(arr,left,mid,right,temp);            //將合并好的區(qū)間拷貝的原數(shù)組中            System.arraycopy(temp,left,arr,left,right-left);        }    }    //負(fù)責(zé)將劃分好的區(qū)間進(jìn)行合并    public static void mergeData(int[] arr,int left,int mid,int right,int[] temp){        int leftT=left;        int midT = mid;        int index=left;        while(leftT

5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性分析

(1)時(shí)間復(fù)雜度

O(*N)

(2)空間復(fù)雜度

這里分析空間復(fù)雜度的時(shí)候不能按照遞歸深度*合并次數(shù)來進(jìn)行計(jì)算,因?yàn)槊看芜f歸合并后,就將之前的空間釋放掉了,所以借助的空間只有之前的輔助空間用來存儲(chǔ)合并有序的數(shù),最終空間復(fù)雜度為O(N)

(3)穩(wěn)定性

在進(jìn)行歸并的時(shí)候沒有間隔,所以穩(wěn)定。

6.應(yīng)用場(chǎng)景

應(yīng)用于外部排序。

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

1.排序思想

統(tǒng)計(jì)相同元素出現(xiàn)的次數(shù),然后根據(jù)統(tǒng)計(jì)的次數(shù)回收到原來的數(shù)組中即可。

2.應(yīng)用場(chǎng)景

對(duì)于數(shù)據(jù)特別集中在某個(gè)范圍內(nèi)時(shí),效率是很高的。

3,思路圖解

?

?4.代碼實(shí)現(xiàn)

   public static void countSort(int[] arr){        int size=arr.length;        if(size==0){            return;        }        int max=arr[0];        int min=arr[0];        //獲取最大最小值        for(int i=1;imax){                max=arr[i];            }            if(arr[i]

5.時(shí)間復(fù)雜度,空間復(fù)雜度及穩(wěn)定性

(1)時(shí)間復(fù)雜度

時(shí)間復(fù)雜度為:O(N),為元素的個(gè)數(shù)

(2)空間復(fù)雜度

空間復(fù)雜度為:O(Max-Min)

(3)穩(wěn)定性

沒有間隔交換穩(wěn)定

6.應(yīng)用場(chǎng)景

對(duì)于數(shù)字比較集中在某個(gè)區(qū)間范圍內(nèi)時(shí)排序效率比較高。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/124498.html

相關(guān)文章

  • 糊涂算法八大排序」總結(jié)——用兩萬字,8張動(dòng)圖,450行代碼跨過排序這道坎(建議收藏)

    摘要:今天,一條就帶大家徹底跨過排序算法這道坎,保姆級(jí)教程建議收藏。利用遞歸算法,對(duì)分治后的子數(shù)組進(jìn)行排序?;舅枷攵雅判蚴抢枚堰@種數(shù)據(jù)結(jié)構(gòu)而設(shè)計(jì)的一種排序算法,堆排序是一種選擇排序,它的最壞,最好,平均時(shí)間復(fù)雜度均為,它也是不穩(wěn)定排序。 ...

    greatwhole 評(píng)論0 收藏0
  • 博客 - 收藏集 - 掘金

    摘要:技術(shù)之類加載機(jī)制掘金類加載機(jī)制是語言的一大亮點(diǎn),使得類可以被動(dòng)態(tài)加載到虛擬機(jī)中。玩轉(zhuǎn)仿探探卡片式滑動(dòng)效果掘金講起本篇博客的歷史起源,估計(jì)有一段歷史了。 Java 技術(shù)之類加載機(jī)制 - Android - 掘金類加載機(jī)制是 Java 語言的一大亮點(diǎn),使得 Java 類可以被動(dòng)態(tài)加載到 Java 虛擬機(jī)中。 這次我們拋開術(shù)語和概念,從例子入手,由淺入深地講解 Java 的類加載機(jī)制。 本文...

    Shimmer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<