常見(jiàn)六種排序算法(java版本)
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
什么是排序算法的穩(wěn)定性?
冒泡排序算法
| 最好 | 平均 | 最壞 | 輔助存儲(chǔ) | 穩(wěn)定 |
|---|---|---|---|---|
| O(n) | O(n2) | O(n2) | O(1) | Y |
public static int [] maopao1(int array[]){
int t;
for(int i = 0;i <array.length;i ++){
for(int j = 0;j < array.length-i-1;j ++){
if(array[j] < array[j+1]){
t = array[j+1];
array[j+1] = array[j];
array[j] = t;
}
}
}
return array;
}
選擇排序算法
| 最好 | 平均 | 最壞 | 輔助存儲(chǔ) | 穩(wěn)定 |
|---|---|---|---|---|
| O(n2) | O(n2) | O(n2) | O(1) | N |
//選擇
public static int [] selectSort(int[] array){
int t = 0;
int max = 0;
for(int i = 0; i < array.length;i ++){
max = i;
for(int j = i;j < array.length;j ++){
if(array[j] > array[max]){
max = j;
}
}
//如果i就是max,不用交換位置
if(i != max){
t = array[max];
array[max] = array[i];
array[i] = t;
}
}
return array;
}
快速排序算法
| 最好 | 平均 | 最壞 | 輔助存儲(chǔ) | 穩(wěn)定 |
|---|---|---|---|---|
| O(nlog(n)) | O(nlog(n)) | O(n2) | O(log(2)(n)) | N |
//快速排序:分而治之的思想,一左一右兩個(gè)指針,以left為基準(zhǔn)
public static void quickSort(int left,int right,int [] arr){
//從小到大排序
int i = left;
int j = right;
//注意:i也不能等于j,當(dāng)i==j說(shuō)明排序完成,最后一次的左/右部分只有一個(gè)數(shù)字
if(i >= j)
return ;
//定義一個(gè)基準(zhǔn)值
int k = arr[left];
while(i != j){
//i不能大于j
if(arr[i] <= k && i < j){
i++;
}
if(arr[j] > k && i < j){
j --;
}
if(i < j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//i == j
if(k > arr[i]){
int temp = arr[left];
arr[left] = arr[i];
arr[i] = temp;
}
//遞歸
quickSort(left,i-1,arr);
quickSort(i,right,arr);
}
歸并排序算法
| 最好 | 平均 | 最壞 | 輔助存儲(chǔ) | 穩(wěn)定 |
|---|---|---|---|---|
| O(nlog(n)) | O(nlog(n)) | O(nlog(n)) | O(n) | Y |
//歸并排序:先分割,再合并
//分割
public static int [] separate(int [] arr){
if(arr.length < 2){
return arr;
}
//找中位數(shù),Math.floor(a)得到小于a的最大整數(shù)
//可能數(shù)組數(shù)量為奇數(shù)的情況下
int mid = (int)Math.floor(arr.length/2);
//分成兩個(gè)
int [] left = Arrays.copyOfRange(arr,0,mid);//(左閉右開(kāi)]
int [] right = Arrays.copyOfRange(arr,mid,arr.length);//因?yàn)橄聵?biāo)從0開(kāi)始,所以本來(lái)就取不到arr.length,不用減一
//遞歸
return merge(separate(left),separate(right));
}
//合并
public static int [] merge(int [] left,int [] right){
int [] arr = new int[left.length+right.length];
if(arr.length < 2){
//判斷如果數(shù)組長(zhǎng)度小于2,那么必定其中一個(gè)數(shù)組有值,一個(gè)無(wú)值,返回有值的即可
return left.length == 0?right:left;
}
int i=0,j=0,k=0;
while(i<left.length && j<right.length){
//把小的那個(gè)數(shù)組添加到新數(shù)組中
if(left[i] < right[j]){
arr[k++] = left[i++];
}else{
arr[k++] = right[j++];
}
}
//最后還有一個(gè)沒(méi)有添加到arr新數(shù)組中,這時(shí)加上去
while(i < left.length){
arr[k++] = left[i++];
}while(j < left.length){
arr[k++] = right[j++];
}
return arr;
}
直接插入排序算法
| 最好 | 平均 | 最壞 | 輔助存儲(chǔ) | 穩(wěn)定 |
|---|---|---|---|---|
| O(n) | O(n2) | O(n2) | O(1) | Y |
public static void insertSortAsc(int [] arr){
for(int i=1;i<arr.length;i++){
int temp=arr[i];//temp哨兵位置
int index=i-1;//index代表與哨兵比較的值的下標(biāo)
//index不能小于0&&升序,把index指向的數(shù)值與哨兵作比較,如果哨兵小于index指向的元素
while(index >=0 && arr[index] > temp){
//把index指向的元素后移一位
arr[index+1] = arr[index];
index --;//index--確保從已經(jīng)排好的元素中選擇,從后往前掃描
}
//這時(shí),在拍排的序列中,比哨兵大的元素都已在哨兵右邊,此時(shí)把哨兵放到index+1位置上即可
arr[index+1] = temp;
}
}
希爾排序算法
| 最好 | 平均 | 最壞 | 輔助存儲(chǔ) | 穩(wěn)定 |
|---|---|---|---|---|
| O(n) | O(n^(3/2)) | O(n^(3/2)) | O(1) | N |
public static void shellSortAsc(int[] arr){
int gap=arr.length/2;//增量,初始為數(shù)組長(zhǎng)度一半
while(gap>=1){
for(int i=gap;i<arr.length;i++){//這里其實(shí)就是插入排序,不過(guò)把原來(lái)的i=1變成i=gap
int temp=arr[i];
int index=i-gap;
while(index>=0&&arr[index]>temp){
arr[index+gap]=arr[index];
index=index-gap;
}
arr[index+gap]=temp;
}
gap=gap/2;//增量遞減
}
}
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接和本聲明。
本文鏈接:
https://blog.csdn.net/suo_jia_hao/article/details/116565973
鋒哥最新SpringCloud分布式電商秒殺課程發(fā)布
??????
??長(zhǎng)按上方微信二維碼 2 秒
感謝點(diǎn)贊支持下哈 
評(píng)論
圖片
表情
