快排

今天写了一次快排,竟然一次成功了,纪念下。

 1 #include <stdio.h>
 2 void swap(int * a, int * b)
 3 {
 4     int t = *a;
 5     *a = *b;
 6     *b = t;
 7 }
 8 int partition(int * an, int first, int last)
 9 {
10     int middle = first + (last - first)/2;
11     int target = an[middle]; //以中间位置为比较点
12     swap(&an[first], &an[middle]);
13     int i = first, j = last;
14     while(i < j)
15     {
16         while(i < last && an[i] <= target)
17             i++;
18         while(j > first && an[j] >= target)
19             j--;
20         if(i < j)
21         swap(&an[i], &an[j]);
22     }
23     swap(&an[first], &an[j]);//交换的是j而不是i,因为i指向的是比target大的值
24     return j;
25 }
26 void quickSort(int * an, int first, int last)
27 {
28     if(first >= last) return ;
29     int mid = partition(an, first, last);
30     quickSort(an, first, mid-1);
31     quickSort(an, mid+1, last);
32 }
33 int main()
34 {
35     int an[10]={2,3,1,5,4,7,8,0,9,6};
36     quickSort(an, 0, 9);
37     for(int i = 0; i < 10; i++)
38         printf("%d ", an[i]);
39     printf("\n");
40     return 0;
41 }
posted @ 2012-05-09 20:11  可乐爱上了雪碧  阅读(218)  评论(0编辑  收藏  举报