快排
1 #include<stdio.h> 2 #include<stdlib.h> 3 void Qsort ( int a[] , int low , int high ) 4 { 5 if( low >= high ) 6 return ; 7 int first = low ; 8 int last = high ; 9 int key = a[first] ; 10 while ( first < last ) 11 { 12 while ( first < last && a[last] >= key ) 13 last--; 14 a[first] = a[last]; 15 while ( first < last && a[first] <= key ) 16 first++; 17 a[last] = a[first]; 18 } 19 20 a[first] = key ; 21 Qsort ( a , low , first - 1 ); 22 Qsort ( a , first + 1 , high ); 23 } 24 int main() 25 { 26 int i; 27 int a[] = {12,341,453,14,657,1341,767,784,3453,4312,4535, 28 564,312,564,3,45,96,4,32,54,13,21,13541}; 29 Qsort ( a , 0 , sizeof(a)/sizeof(a[0]) - 1 ); 30 for( i = 0 ; i < sizeof(a)/sizeof(a[0]) ; i++ ) 31 { 32 printf("%d ", a[i] ); 33 } 34 printf("\n"); 35 return 0; 36 }
百度上的版本是以a[1]为“标杆”,下面这个版本是学长提供的以一个随机数a[rand]作为“标杆”。
还有Qsort 是会退化成n^2 , 运气很差时:比如说从小到大排时 , 每快 标杆 都取到了每块的最大值。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #include<iostream> 5 using namespace std; 6 void Qsort ( int* a , int l , int r )//a[l,r) 7 { 8 int len = r - l ; 9 if( len <= 1 ) return ; 10 int pos = rand() % (r - l); 11 swap( a[l+pos] , a[r-1] ); 12 int cnt = 0 ;//计算 <= a[r-1] 的数共有j个 13 for(int i = l ; i < r ; i++) 14 { 15 if ( a[i] <= a[r-1] ) { 16 swap( a[l+cnt] , a[i] ); 17 cnt++ ; 18 } 19 } 20 Qsort(a , l , l + cnt - 1); 21 Qsort(a , l + cnt , r ); 22 } 23 int main() 24 { 25 srand(time(NULL));//根据运行时间随机生成一个数 26 // printf("srand=%d\n",rand()); 27 int a[] = {10,45,85,78,96,32,20,45,20,10,32,1,5,6,25,10,96,74}; 28 29 Qsort ( a , 0 , sizeof(a)/sizeof(int) ); 30 for ( int i = 0 ; i < sizeof(a)/sizeof(int) ; i++ ) 31 { 32 printf( "%d " , a[i] ); 33 } 34 printf("\n"); 35 return 0 ; 36 }