排序算法包括很多種,其中快速排序是其中一種比較快的排序算法,今天就來介紹一下:
快速排序的基本實現思想就是將當前待排序列分成兩個部分、一個值。一個值:就是選定出一個值作為被比較的元素。兩個部分:所有比該被選定元素大的部分都去該元素的右邊,所有比被選定元素小的部分都去該元素的左邊。這樣我們就確定了該元素在這個待排序列中的位置,其實也就是我們已經將這個元素“排好了”。
那么,怎么才能完成一次的快速排序呢?
我們選定一個被比較的元素,一般都是選第一個,即數組中第一個元素作為val,然后我們給出兩個指針,一個指向最左邊的元素,我們叫做low,一個指向最右邊的元素,我們叫做hight,即如下圖所示:
一次快速排序就是有hight開始比較,因為我們是升序排列,所以,當hight指向的元素比val大的時候,hight所指向的元素的位置相對於val不應該發生改變,然后hight-1,即我們hight的位置向左移動一位,然后在比較hight元素和val,直到找到一個hight元素比val小,我們就將hight所指向的元素賦給low所指向的元素,記住,此時hight不動。然后我們去移動low元素,當low元素比val小的時候,low元素的位置相對於val不應該發生改變(當前為升序排列,小的就應該在左邊),然后low+1,即low的位置向右移動一位,然后在繼續比較low元素和val,直到找到一個low元素比val大,我們就將low所指向的元素賦給hight位置,記住,此時low不動,然后去移動hight元素,以此類推,直到low和hight的位置重合,即我們當前已經沒有任何沒有比較過的元素,即此位置就是val應該在的位置。一次快速排序結束。如下圖所示:
一次快速排序完成后,我們只是找到了第一個元素的位置,所以我們采用遞歸的方法將左邊的元素和右邊的元素都采用快速排序進行對被選定元素的位置排序,直到整個序列只剩下一個元素,我們的快速排序就完成了。
下面給出c語言實現的代碼,直接看注釋就好了,所有的解釋都寫在注釋上了:
1 #include <stdio.h> 2 3 /* 4 @http://www.cnblogs.com/WuNaiHuaLuo/ 5 */ 6 7 void quicksort(int *arr,int low,int hight); 8 int findPos(int *arr,int low,int hight); 9 10 int main(int argc, char *argv[]) 11 { 12 int arr[5]={2,1,3,78,53}; 13 quicksort(arr,0,4); //0表示從數組0位置開始,到4位置排序 14 int i; 15 for(i=0;i<5;++i){ 16 printf("%d ",arr[i]); 17 } 18 19 20 21 return 0; 22 } 23 24 /* 25 快速排序算法 26 */ 27 void quicksort(int *arr,int low,int hight){ //快速排序算法的實質就是當前分為兩半,分別給這兩半進行快速排序,直到low==hight的時候 28 int pos; 29 if(low<hight){ 30 pos=findPos(arr,low,hight); //先對整體進行一次快速排序,將其分成兩半 31 quicksort(arr,low,pos-1); //然后分別對pos位置左邊的部分在進行快速排序,位置右邊的部分進行快速排序 32 quicksort(arr,pos+1,hight); 33 } 34 } 35 36 int findPos(int *arr,int low,int hight){ 37 int val=arr[low]; 38 while(low<hight){ //再一次快速排序中只要low的值比hight小,我們就應該去移動,因為當前這次排序還沒有完成 39 while(low<hight&&arr[hight]>=val){ //表示只有當前指針沒有重合並且當前右邊hight指向的值大於val時,才會向左移動hight 40 hight=hight-1; 41 } 42 arr[low]=arr[hight]; //將比val小的值賦到low 43 while(low<hight&&arr[low]<=val){ 44 low=low+1; 45 } 46 arr[hight]=arr[low]; //將比val大的值賦到hight上 47 } 48 arr[low]=val; //找到了所屬的位置,並且將我們選定的值val賦到這個位置上去 49 return hight; 50 }
以上就是數據結構中快速排序的原理和代碼實現,這只是我自己的學習理解,歡迎大家對其中不對的地方進行指正。
該博文屬博主原創,轉載請標明出處。