版權聲明:本文為博主原創文章,未經博主允許不得轉載。博客源地址為zhixiang.org.cn https://blog.csdn.net/myFirstCN/article/details/80851021
學習更多算法系列請參考文章:死磕算法之匯總篇
快速排序是一個運用了分治法和遞歸算法的排序方式。
假如我們現在要排序的數組為[3,1,0,2,8,4,2]。那么在進行快速排序的時候我們先要進行一些準備:
- n作為一個數組中的標桿,一趟排序過后我們要把數組中所有大于n的數放在它的右邊,所有小于n的放在它的左邊。一般情況下我們會取數組第一個元素作為n,在此數組中就是n=3
- i我們使用i來找數組中大于標桿的值,i初始指向數組第一個位置
- j我們使用j來找數組中小于標桿的值,j初始指向數組最后一個位置
下面開始排序:
- 先從數組右邊開始,我們發現j指向的元素2比標桿n小,那么我們將j指向的元素賦值給i指向的元素,停止操作。此時數組為[2,1,0,2,8,4,2],i指向第一個位置,j仍指向最后一個。
- 從數組左邊開始,i指向的元素2比標桿小,所以不做操作,使i++,i指向的元素1比標桿小,所以不做操作,使i++,一直到i指向8的時候比標桿大(注意此處如果等于的話也要操作),那么就把i指向的元素賦值給j指向的元素,此時數組為[2,1,0,2,8,4,8],i指向第五個位置。也就是元素8,j仍然指向最后一個位置。
- 繼續從右邊操作,j指向的8不比n小,所以不做操作,j--,4不比3小,不做操作,j--。現在i和j的位置重合了,把n放到這個位置上。我們此輪的操作也就結束了,接下來我們把3所在的位置左邊分為一個數組,右邊位置分為一個數組再次進行剛才的操作。(此處就是一個遞歸調用了)
接下來就來看一個圖片描述的過程
接下來上代碼
public static void quickSort(int[] a, int l, int r) {if (l < r) {int i,j,n;
i = l;j = r;n = a[i];while (i < j) {while(i < j ){if(a[j] < n){a[i] = a[j];
break;
}j--;
}while(i < j ){if(a[i] >= n){a[j] = a[i];break;
}i++;}}a[i] = n;quickSort(a, l, i-1); /* 遞歸調用 */quickSort(a, i+1, r); /* 遞歸調用 */}
}
快速排序講完了。在這里溫馨提示大家,學習算法時,我們沒必要拘泥于代碼的實現,那沒有意義。我的建議就是深入理解步驟,當你理解步驟以后代碼是隨你怎么玩都可以的。