手写快速排序(QuickSort)
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 5 using namespace std; 6 7 int partition(int *a,int left,int right) 8 { 9 a[0] = a[left]; //设置a[left]为主键值,存于a[0],即以a[left]值将[left,right]区间一分为二 10 while(left<right) 11 { 12 while(left<right&&a[right]>=a[0]) right--; //从右边开始找到比主键值a[0]小的值,移到左边 13 a[left]=a[right]; 14 while(left<right&&a[left]<=a[0]) left++; //从左边开始找到比主键值a[0]大的值,移到右边 15 a[right]=a[left]; 16 } 17 a[left] = a[0]; //跳出while循环后的left==right,此时,区间已经一分为二了,将a[left]的值还原 18 return left; 19 } 20 21 void QuickSort(int *a,int left,int right) 22 { 23 if(left<right) //快拍区间要大于1 24 { 25 int mid = partition(a,left,right); //进行一次划分,以a[left]划分区间为左右两个区间 26 QuickSort(a,left,mid-1); //对左区间进行进一步划分 27 QuickSort(a,mid+1,right); //对左区间进行进一步划分 28 } 29 } 30 31 int main() 32 { 33 int n; 34 int a[10000]; 35 while(~scanf("%d",&n)) 36 { 37 int i; 38 for(i=1;i<=n;i++) 39 { 40 scanf("%d",a+i); 41 } 42 QuickSort(a,1,n); 43 for(i=1;i<=n;i++) 44 { 45 printf("%d ",a[i]); 46 } 47 putchar(10); 48 } 49 return 0; 50 }