- #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指针新的位置。
快速排序法
原文:http://www.cnblogs.com/wshyj/p/6012115.html