【算法导论】第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 }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值