快排
今天写了一次快排,竟然一次成功了,纪念下。
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 }