排序算法:冒泡排序、插入排序、选择排序、希尔排序
?
相關博客:
排序算法:冒泡排序、插入排序、選擇排序、希爾排序
排序算法:歸并排序、快速排序
排序算法:桶排序、計數排序、基數排序
排序算法:堆排序
十大排序算法小結
一、冒泡排序:
1、算法原理:
冒泡排序只會操作相鄰的兩個數據。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關系的要求。如果不滿足就讓它倆互換位置。一次冒泡會讓至少一個元素移動到它應該在的位置,重復n次,就完成了n個數據的排序工作。
2、算法描述:
(1)比較相鄰的元素。如果第一個比第二個大,就交換它們兩個;
(2)對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最后一對,這樣在最后的元素應該會是最大的數;
(3)針對所有的元素重復以上的步驟,除了最后一個;
重復步驟1~3,直到排序完成。
3、動圖演示:
4、Java代碼實現:
//1、冒泡排序public void bubbleSort(int[] a){int len = a.length;for(int i=0;i<len;++i){//提前退出冒泡循環的標志boolean flag = false;for(int j=0;j<len-i-1;++j){if(a[j]>a[j+1]){int temp = a[j];a[j]=a[j+1];a[j+1]=temp;flag=true;//true表示有數據交換}}if(!flag) break;//沒有數據交換,提前退出}}5、算法分析:
(1)冒泡的過程中只涉及相鄰數據的交換操作,只需要常量級的臨時空間,所以它的空間復雜度為O(1),是一個原地排序算法。
(2)冒泡排序是穩定的排序算法。
(3)最好時間復雜度為O(n),最壞時間復雜度為O(n^2),平均時間復雜度為O(n^2)。
二、插入排序:
1、算法原理:
將數組的數據分為兩個區間,已排序區間和未排序區間。初始已排序區間只有一個元素,就是數組的第一個元素。算法的核心思想就是,取未排序區間中的元素,在已排序區間中找到合適的位置將其插入,并保證已排序區間的數據一直有序。重復這個過程,直到未排序區間中元素為空,算法結束。
2、算法描述:
(1)從第一個元素開始,該元素可以認為已經被排序;
(2)取出下一個元素,在已經排序的元素序列中從后向前掃描;
(3)如果該元素(已排序)大于新元素,將該元素移到下一位置;
(4)重復步驟3,直到找到已排序的元素小于或者等于新元素的位置;
(5)將新元素插入到該位置后;
(6)重復步驟2~5。
3、動圖演示:
4、Java代碼實現:
//2、插入排序public void insertSort(int[] a){int len=a.length;for(int i=1;i<len;++i){int current=a[i];int j=i-1;//查找需要插入的位置for(;j>=0;--j){if(a[j]>current){a[j+1]=a[j];}else{break;}}a[j+1]=current;//插入數據}}5、算法分析:
(1)插入算法的運行只需要用到一個額外的額存儲空間,所以空間復雜度為O(1),是原地排序算法。
(2)插入算法是穩定的排序算法。
(3)最好時間復雜度為O(n),最壞時間復雜度為O(n^2),平均時間復雜度為O(n^2)。
三、選擇排序:
1、算法原理:
選擇排序的實現思路和插入排序類似,也分為已排序區間和未排序區間。但是選擇排序每次會從未排序區間中選擇最小(最大)的元素,存放已排序區間的末尾。重復此操作,直到所有元素排序完畢。
2、算法描述:
(1)初始狀態:無序區為R[1..n],有序區為空;
(2)第i趟排序(i=1,2,3…n-1)開始時,當前有序區和無序區分別為R[1..i-1]和R(i..n)。該趟排序從當前無序區中-選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R[i+1..n)分別變為記錄個數增加1個的新有序區和記錄個數減少1個的新無序區;
(3)n-1趟結束,數組有序化了。
3、動圖演示:
4、Java代碼實現:
//3、選擇排序:public void selectionSort(int[] a){int len = a.length;int minIndex,temp;for(int i=0;i<len;i++){minIndex=i;//尋找未排序部分的最小值的索引for(int j=i+1;j<len;j++){if(a[j]<a[minIndex]){minIndex=j;}}temp=a[i];a[i]=a[minIndex];a[minIndex]=temp;}}5、算法分析:
(1)選擇排序的空間復雜度為O(1),是一種原地排序算法。
(2)選擇排序不是一種穩定的排序算法。因為選擇排序每次都要從未排序區間中選擇最小值,并和前面的元素交換位置,這樣會破壞穩定性。
(3)選擇排序的最好、最壞、平均時間復雜度都是O(n^2)。
四、希爾排序:
1、算法原理:
希爾排序是簡單插入排序的改進版。他與插入排序的不同之處在于,它會優先比較較遠的元素。希爾排序又叫縮小增量排序。希爾排序的核心在于間隔序列的設定(也就是增量)。既可以提前設定好間隔序列,也可以動態定義間隔序列。
2、算法描述:
先將整個待排序的記錄序列分割成為若干子序列分別進行直接插入排序,具體算法描述:
(1)選擇一個增量序列t1,t2,…,tk,其中ti>tj,i<j,tk=1;
(2)按增量序列個數k,對序列進行k 趟排序;
(3)每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m(m=length/ti)?的子序列,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為一個表來處理,表長度即為整個序列的長度。
3、動圖演示:
4、Java代碼實現:
//4、希爾排序:public void shellSort(int[] a){int len = a.length;//希爾排序的關鍵在于設置增量,這里我們動態設置一個增量int gap=1;while(gap<len/3){gap=gap*3+1;}int temp;for(;gap>0;gap=(int) Math.floor(gap/3)){for(int i=gap;i<len;i++){temp = a[i];int j=i-gap;for(;j>=0 && a[j]>temp;j-=gap){a[j+gap]=a[j];}a[j+gap]=temp;}}}5、算法分析:
(1)希爾排序的空間復雜度為O(1),是一種原地排序算法。
(2)希爾排序不是一種不穩定的排序算法。多次插入排序,我們知道一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最后其穩定性就會被打亂,所以希爾排序是不穩定的。
(3)選擇排序的最好時間復雜度為O(n)、最壞時間復雜度都是O(n^2),平均時間復雜度為O(n^1.3)。
?
?
參考文章:https://www.cnblogs.com/onepixel/p/7674659.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的排序算法:冒泡排序、插入排序、选择排序、希尔排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《剑指offer》答案整理
- 下一篇: 排序算法:归并排序、快速排序