手写快速排序(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 }

 

posted @ 2013-08-06 17:31  crazy_apple  阅读(2172)  评论(0编辑  收藏  举报