基於c語言實現的快速排序算法
阿新 • • 發佈:2018-01-18
。。 時間 所在 排序算法 sca 輸出 void oid 快速排序
題目描述:對輸入的n個數進行排序並輸出。
解題思路:其實是很常規的排序題,但是為了一復習,所以采用快排的方法。這裏就當是快速排序的代碼實現練習好了。
快速排序是非常經典的一個算法,可以在對數規模的時間下實現對一組數的排序。
其基於分治的思想,每一趟排序把原組數劃分為更小的範圍進行排序,並且一定有一個數會在每趟排序下放在最終的位置。
用通俗的語言描述這個過程,就是從這一個分組的兩頭開始向中間遍歷,一邊遍歷一邊把大的放到右邊,小的放到左邊。
最後當low=high時停留在pivot的位置,再將一開始樞紐pivot的元素塞回去。
樞紐元素pivot最後所在的位置為其最終位置,最後以樞紐元素為中心把大分組的元素劃分為兩部分
遞歸調用快排函數,對於更小的部分繼續排序、劃分、再對更小的分組進行快排,再劃分……
註:pivot的選取是任意的,這裏為了方便每次選取最左元素作為樞紐。實際上每次如果選取的樞紐在一趟排序後恰能把這一組數據從中間劃分為兩部分最佳。
(一趟排序後pivot左邊的元素不一定有序,但比pivot元素小(<=);pivot右邊的元素也同理,不一定有序,但比pivot元素大。(>=))
對於快排算法我一開始學習也是比較大頭,時間久了就很熟悉了。想起大三上算法課的時候居然還和老師說快排是基於二分的思想。。。真是丟死人了
上學期復習排序的時候特意畫了一張模擬的小漫畫,現在不在身邊。等下學期回學校再拍一下傳上來放這裏。
#include<stdio.h> void quick_sort(int *a,int l,int h) { if(l<h)//如果分組裏還有兩個以上的元素,繼續排序 { int pivot=a[l]; int low=l; int high=h; while(low<high) { while(low<high&&a[high]>=pivot) { high--; } a[low]=a[high]; while(low<high&&a[low]<=pivot) { low++; } a[high]=a[low]; } a[low]=pivot; quick_sort(a,l,low-1); quick_sort(a,low+1,h); } else return ; } int main() { int a[10001]; int n,i; while(scanf("%d",&n)!=EOF) { int len=n; i=0; while(n--) { scanf("%d",&a[i]); i++; } quick_sort(a,0,len-1); for(i=0;i<len;i++) { printf("%d ",a[i]); } } return 0; }
基於c語言實現的快速排序算法