最近在學算法,學到快速排序心得就和你們分享一下。如下代碼爲c作演示,看不懂代碼沒關係,作參考就行了,主要爲了明白快速排序思路。但願能幫助到你們。
快速排序分爲4個步驟算法
文字描述已講述完,接下來草稿演示,也能夠直接向下翻看代碼,可能代碼更有說服力
國足有6名隊員從左到右身高排序球號爲: 5號 9號 12號 3號 7號 8號ui
教練規定左邊第一個最高的爲隊長(基準數):5號
教練要拆分兩個隊:指針
右邊的球號要小於隊長球號而且左邊球號不能大於右邊 找到後和左邊交換位置code
左邊的球號要大於隊長球號而且左邊球號不能大於右邊排序
而後右邊繼續走找比5小的,最後走到了左隊座標位置,兩個相遇相等的座標讓隊長(基準數)放到相遇的位置。排隊完成。最終獲得的順序爲:遞歸
左隊都是比隊長(5號)球號小的,右邊都是比隊長大的get
接下來就要從隊長開始繼續拆分左、右邊和上面教練說的同樣直到不能拆分爲止io
整個思路基本就這樣,接下來代碼實現:技術
#include <stdio.h> #include <stdlib.h> int a[101],n; /** * 快速排序: * 1.以左邊第一位做爲基準數, * 2.先右邊找一個比基準數小的數與左指針所在的位置進行交換 * 3.從左邊找一個比基準數大的數與右指針所在的位置進行交換 * 4.相遇後則把基準數和左、右指針重合的位置進行交換 * 5.重複1/2/3/4操做 * 注意: * 若是左座標大於右座標位置則沒法計算,必須左座標小於右座標。 */ void quicksort(int left, int right){ int i,j,base; i = left; j = right; if (left>right) return ; // 1.第一步,定義基準數 base = a[left]; // 4.左座標不等於右座標時繼續迭代,等於則相遇 while(left != right){ // 2.若是右邊大於基準數則繼續遞減迭代至小於基準數中止 while(left<right && a[right]>=base) right--; // 2.1 與左指針所在位置進行交換 a[left] = a[right]; // 3.若是左邊小於基準數則繼續遞增迭代至大於基準數中止 while(left<right && a[left]<=base) left++; // 3.1 與右指針所在位置進行交換 a[right] = a[left]; } // 4.1 左右座標相遇替換基準數 a[left] = base; // 5.重複1.2.3.4 遞歸 quicksort(i, left-1); // 重複基準數左邊 quicksort(left+1, j); return; } int main() { int i,j; printf("=============快速排序==============\r\n"); printf("請輸入數量:"); scanf("%d", &n); for (i=1; i<=n; i++){ scanf("%d", &a[i]); } quicksort(1, n); printf("快速排序結果:\r\n"); for (i=1; i<=n; i++) printf("%d ", a[i]); getchar(); getchar(); system("pause"); return 0; }
本文作爲技術參考,也歡迎大神們指導和批評,但願對你們有幫助。sort