代码改变世界

排序算法-------快速排序

2011-10-02 11:00  ...平..淡...  阅读(264)  评论(0编辑  收藏  举报

排序算法基本思想:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,然后分别对这两部分继续进行排序,以达到整个记录有序。

排序算法中Partition函数的作用可通过下图描述:

首先,定义i、j,i指向首元素的前一个位置,j指向首元素。

然后,比较第j个元素和第r个元素大小,若第j个元素小,则i+1,交换第i个元素和第j个元素

最后,循环结束,交换第i+1个元素和第r个元素

通过上面的步骤,就可以达到将待排序的元素分割成两个独立部分,并且前面部分最大元素小于后面部分最小元素。

Click To expand

快速排序
 1 #include <iostream>
2 using namespace std;
3
4
5 //元素交换
6 void swap(int &a,int &b)
7 {
8 int temp=a;
9 a=b;
10 b=temp;
11 }
12
13 /*///////////////////////////////////////////////
14 快速排序
15 */
16 int Partition(int *a,int p,int r)
17 {
18 int i = p-1;
19 int j = p;
20 for(j=p;j<r;j++)
21 {
22 if(a[j]<a[r])
23 {
24 i++;
25 swap(a[i],a[j]);
26 }
27 }
28 swap(a[i+1],a[r]);
29 return i+1;
30 }
31
32 void QuickSort(int *a,int p,int r)
33 {
34 if(p<r)
35 {
36 int q = Partition(a,p,r);
37 QuickSort(a,p,q-1);
38 QuickSort(a,q+1,r);
39 }
40 }
41 /////////////////////////////////////////////////
42
43
44 int main()
45 {
46 int n,i,a[20];
47 cout<<"请输入数组元素n:"<<endl;
48 cin>>n;
49 cout<<"请输入"<<n<<"个元素:"<<endl;
50 for(i=0;i<n;i++)
51 cin>>a[i];
52 QuickSort(a,0,n-1);
53 for(i=0;i<n;i++)
54 cout<<a[i]<<" ";
55 cout<<endl;
56 return 0;
57 }

时间复杂度解析:

根据快速排序的过程分析,可用表达式  T (n) 2T (n/2) + Θ(n)  表示其排序的时间复杂度,可求得T (n) = O(n lg n). 即时间复杂度为O(nlogn)