【算法导论】第7章快速排序

1、算法描述

  快速排序也是基于分治模式的,下面是一个典型子数组A[p..r]排序的分治过程,主要分为三个步骤:

  (1)分解:将数组A[p..r]划分成两个子数组A[p...q-1]和A[q+1...r],使得前一个数组中每个值都小于等于A[q],后一个数组每个值都大于A[q],下标q也在这个分解过程中求得。

  (2)解决:通过递归调用对两个子数组分别进行排序。

  (3)合并:两个子数组是就地进行排序的,所以他们的合并并不需要操作,这个数组已经有序了。。

2、具体实现:

  形参和实参的区别:

  (1)实现一:

View Code
 1 #include<stdio.h>
 2 int partition(int *ptr,int p,int r)//一次划分过程
 3 {
 4     int i,j,temp;
 5     int x=*(ptr+r-1);
 6     i=p-1;
 7     for(j=p;j<r;j++)
 8     {
 9         if(*(ptr+j-1)<=x)
10         {
11             i++;
12             temp=*(ptr+j-1);
13             *(ptr+j-1)=*(ptr+i-1);
14             *(ptr+i-1)=temp;
15         }
16     }
17     i++;
18     temp=*(ptr+i-1);
19     *(ptr+i-1)=*(ptr+r-1);
20     *(ptr+r-1)=temp;
21     return(i);
22 }
23 void quicksort(int *ptr,int p,int r)//递归排序
24 {
25     int q;
26     if(p<r)
27     {
28         q=partition(ptr,p,r);
29         quicksort(ptr,p,q-1);
30         quicksort(ptr,q+1,r);
31     }
32 }
33 void main()
34 {
35     int a[8]={2,8,7,1,3,5,6,4};
36     quicksort(a,1,8);
37     for(int i=0;i<8;i++)
38         printf("%d  ",a[i]);
39 }

  (2)实现二:

View Code
 1 #include<stdio.h>
 2 int partition(int ptr[],int p,int r)//一次划分过程
 3 {
 4     int i,j,temp;
 5     int x=ptr[r-1];
 6     i=p-1;
 7     for(j=p;j<r;j++)
 8     {
 9         if(ptr[j-1]<=x)
10         {
11             i++;
12             temp=ptr[j-1];
13             ptr[j-1]=ptr[i-1];
14             ptr[i-1]=temp;
15         }
16     }
17     i++;
18     temp=ptr[i-1];
19     ptr[i-1]=ptr[r-1];
20     ptr[r-1]=temp;
21     return(i);
22 }
23 void quicksort(int ptr[],int p,int r)//递归排序
24 {
25     int q;
26     if(p<r)
27     {
28         q=partition(ptr,p,r);
29         quicksort(ptr,p,q-1);
30         quicksort(ptr,q+1,r);
31     }
32 }
33 void main()
34 {
35     int a[8]={2,8,7,1,3,5,6,4};
36     quicksort(a,1,8);
37     for(int i=0;i<8;i++)
38         printf("%d  ",a[i]);
39 }

 

posted @ 2012-06-18 09:38  lpshou  阅读(329)  评论(1编辑  收藏  举报