標籤:key main 排序 style 遞迴 i++ 應該 均值 個數
- #include <stdio.h>
- #include <stdlib.h>
-
- void swap(int *x,int *y) // 交換函數
- {
- int temp;
- temp = *x;
- *x = *y;
- *y = temp;
- }
-
- int choose_pivot(int i,int j ) //取兩數平均值函數
- {
- return((i+j) /2);
- }
-
- void quicksort(int list[],int m,int n) //快速排序函數,m,n分別是左界 右界 比如10個數排序中的 0 和9
- {
- int key,i,j,k;
- if( m < n)
- {
- k = choose_pivot(m,n); 求得中間位置的值
- swap(&list[m],&list[k]);
- key = list[m];
- i = m+1;
- j = n;
- while(i <= j)
- {
- while((i <= n) && (list[i] <= key))
- i++;
- while((j >= m) && (list[j] > key))
- j--;
- if( i < j)
- swap(&list[i],&list[j]);
- }
- // 交換兩個元素的位置
- swap(&list[m],&list[j]);
- // 遞迴地對較小的資料序列進行排序
- quicksort(list,m,j-1);
- quicksort(list,j+1,n);
- }
- }
-
- void printlist(int list[],int n)
- {
- int i;
- for(i=0;i<n;i++)
- printf("%d\t",list[i]);
- }
-
- void main()
- {
- const int MAX_ELEMENTS = 10;
- int list[MAX_ELEMENTS];
-
- int i = 0;
-
- // 產生以數列填滿的隨機數
- for(i = 0; i < MAX_ELEMENTS; i++ ){
- list[i] = rand();
- }
- printf("進行排序之前的序列:\n");
- printlist(list,MAX_ELEMENTS);
-
- // sort the list using quicksort
- quicksort(list,0,MAX_ELEMENTS-1);
-
- // print the result
- printf("使用快速排序演算法進行排序之後的序列:\n");
- printlist(list,MAX_ELEMENTS);
- }
- 這段程式並不難,應該很好看懂,我把過程大致講一下,首先你的腦子裡先浮現一個數組和三個指標,第一個指標稱為p指標,在整個過程結束之前它牢牢的指向第一個數,第二個指標和第三個指標分別為lo指標和hi指標,分別指向最左邊的值和最右邊的值。lo指標和hi指標從兩邊同時向中間逼近,在逼近的過程中不停的與p指標的值比較,如果lo指標的值比p指標的值小,lo++,還小還++,再小再++,直到碰到一個大於p指標的值,這時視線轉移到hi指標,如果 hi指標的值比p指標的值大,hi--,還大還--,再大再--,直到碰到一個小於p指標的值。這時就把lo指標的值和hi指標的值做一個調換。持續這過程直到兩個指標碰面,這時把p指標的值和碰面的值做一個調換,然後返回p指標新的位置。
快速排序法