博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速排序算法所有版本的c/c++实现
阅读量:5337 次
发布时间:2019-06-15

本文共 1463 字,大约阅读时间需要 4 分钟。

一、算法导论上的版本

在我写的第二篇文章中,我们已经知道:
“再到后来,N.Lomuto又提出了一种新的版本,此版本....,即优化了PARTITION程序,它现在写在了 算法导论 一书上”:

快速排序算法的关键是PARTITION过程,它对A[p..r]进行就地重排:

PARTITION(A, p, r)

1  x ← A[r]         //以最后一个元素,A[r]为主元
2  i ← p - 1
3  for j ← p to r - 1    //注,j从p指向的是r-1,不是r。
4       do if A[j] ≤ x
5             then i ← i + 1
6                  exchange A[i] <-> A[j]
7  exchange A[i + 1] <-> A[r]    //最后,交换主元
8  return i + 1

然后,对整个数组进行递归排序:

QUICKSORT(A, p, r)

1 if p < r
2    then q ← PARTITION(A, p, r)   //关键
3         QUICKSORT(A, p, q - 1)
4         QUICKSORT(A, q + 1, r)

    根据上述伪代码,我们不难写出以下的c/c++程序:

首先是,PARTITION过程:

int partition(int data[],int lo,int hi) 

{
 int key=data[hi];  //以最后一个元素,data[hi]为主元
 int i=lo-1;
 for(int j=lo;j<hi;j++)   ///注,j从p指向的是r-1,不是r。
 {
  if(data[j]<=key)
  {
   i=i+1;
   swap(&data[i],&data[j]);
  }
 }
 swap(&data[i+1],&data[hi]);   //不能改为swap(&data[i+1],&key)
 return i+1;
}

补充说明:举个例子,如下为第一趟排序(更多详尽的分析请参考第二篇文章):

第一趟(4步):
   a:3   8   7   1   2   5   6   4   //以最后一个元素,data[hi]为主元

   b:3   1   7   8   2   5   6   4

   c:3   1   2   8   7   5   6   4

   d:3   1   2   4   7   5   6   8    //最后,swap(&data[i+1],&data[hi])

  而其中swap函数的编写,是足够简单的: 

void swap(int *a,int *b)

{
 int temp=*a;
 *a=*b;
 *b=temp;
}

    然后是,调用partition,对整个数组进行递归排序:

void QuickSort(int data[], int lo, int hi)

{
    if (lo<hi)
    {
        int k = partition(data, lo, hi);
        QuickSort(data, lo, k-1);
        QuickSort(data, k+1, hi);
    }

int main()

{

const int MAX = 10;

int array[MAX] = {1, 2, 6, 2, 9, 0, 2, 4, 5, 3};
quicksort(array, 0, MAX-1);//这里为数组长度减1
for(int i = 0;i<MAX ;i++)
cout<<array[i]<<endl;
return 0;

}

转载于:https://www.cnblogs.com/Vulkan/archive/2012/07/04/7530290.html

你可能感兴趣的文章
erlang http post 发送数据请求
查看>>
Unresolved external CheckAutoResult
查看>>
[收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招...
查看>>
tinkcmf视频上传大小限制
查看>>
《第1章:统计学习方法概论》
查看>>
JS定时器时间日期钟表
查看>>
partial(C# 参考)
查看>>
Supervisor介绍、安装及配置
查看>>
openshift 添加cron定时任务
查看>>
sublime text3在指定浏览器上本地服务器(localhost)运行文件(php)
查看>>
【ABAP系列】SAP ABAP基础-录制BDC的MODE定义解析
查看>>
C++编写DLL的方法
查看>>
第八周
查看>>
iOS-打电话、发短信、发邮件、打开浏览器
查看>>
[Swift]LeetCode646. 最长数对链 | Maximum Length of Pair Chain
查看>>
Echars 在界面上自适应问题
查看>>
[Vue-rx] Share RxJS Streams to Avoid Multiple Requests in Vue.js
查看>>
201621123023《Java程序设计》第10周学习总结
查看>>
Alpha 冲刺 (5/10)
查看>>
得到程序当前UAC的执行权限,高 - 中 - 低
查看>>