c++练习-快速排序
这个例子将长度为r的数列a从按照从小到大作排列
快速排序的思想简单说来就是
在a中依次先选定一个数key,将这个数依次与a中的其他数做对比,如果比key小则放到key前面,如果比key大就放到key后面。这样对数组a就会分成两个部分。假设位置替换后key最终位置时k。
那么数组的两个部分就分别是 a[0,k-1],a[k+1,r].这时候a[k]已经排好序了
分别对这两个部分进行上面的操作。又会分别分出四个部分。对它们进行同样操作。直到都无法再排序为止跳出循环。
伪代码如下:
void Qsort(array a, int low, int high)
if low >= high return;
int first = low;
int last = high;
a[first] -> key;
while(first<last)
while(first<last && a[last] > key) last--;
a[first] = a[last];
while(first<last && a[first] < key) first++;
a[last] = a[first];
a[first] = key;
int k = first;
Qsort(array a, 0, k-1);
Qsort(array a, k+1, high);
具体代码如下:
#include <iostream>
#include <stdlib.h> using namespace std; void Qsort(int a[],int low,int high)
{
if(low>=high) return;
int first=low;
int last=high; //这里的high是这个数组的长度
int key=a[first];
while(first<last)
{
while(first<last&&a[last]>=key) last--; //如果比key大,无需移动,所以last只减少,不赋值
a[first]=a[last]; //直到碰到比key小的数,将这个数放到first所在的位置。
while(first<last&&a[first]<=key) first++;//如果比key小,无需移动,只要将first增加
a[last]=a[first];//直到碰到比key大的数,将这个数放到last的位置。
}
a[first]=key; //first和last碰头之后,也就是first>=last,说明整个数组遍历了一遍。因此跳出循环,将key值赋予a[first]或者a[last]
Qsort(a,low,first-);//first和last是一样的,选哪个都可以
Qsort(a,first+,high);
}
int main()
{
int k = rand() % ;
int i = ;
int a[];
while(i < ) a[i++] = rand() % ; //生成大小10的随机数组 Qsort(a,,sizeof(a)/sizeof(a[])-);//计算数组大小,注意数组是从0开始计算的,因此会-1。 for(int i=;i<sizeof(a)/sizeof(a[]);i++)
{
cout<<a[i]<<" ";
}
cout << endl;
return();
}
c++练习-快速排序的更多相关文章
- [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序
用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html 目录 马桶排序(令人 ...
- 算法与数据结构(十六) 快速排序(Swift 3.0版)
上篇博客我们主要聊了比较高效的归并排序算法,本篇博客我们就来介绍另一种高效的排序算法:快速排序.快速排序的思想与归并排序类似,都是采用分而治之的方式进行排序的.快速排序的思想主要是取出无序序列中第一个 ...
- [算法]——快速排序(Quick Sort)
顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...
- 排序算法----调用库函数qsort进行快速排序
功 能: 快速排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const ...
- Html5 快速排序演示
快速排序(Quicksort)是对冒泡排序的一种改进.快速排序由C. A. R. Hoare在1962年提出. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...
- Java 快速排序两种实现
快速排序,只要学习过编程的人肯定都听说过这个名词,但是有时候写的时候还真蒙住了,网上搜罗了下以及查阅了"introduction to algorithm",暂时找到两种实现快排的 ...
- java基础算法之快速排序
快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.figh ...
- PAT 1045. 快速排序(25)
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列,请问有多 ...
- 快速排序中的partition函数的枢纽元选择,代码细节,以及其标准实现
很多笔试面试都喜欢考察快排,叫你手写一个也不是啥事.我很早之前就学了这个,对快速排序的过程是很清楚的.但是最近自己尝试手写,发现之前对算法的细节把握不够精准,很多地方甚至只是大脑中的一个映像,而没有理 ...
- php冒泡排序和快速排序
如有错误,请指出... //快速排序(array_merge整合数组)function quick_sort($arr){ $num=count($arr); if($num<=1){ retu ...
随机推荐
- CSS属性绘制图形(一)
div部分: <div class="react-logo"> <div class="reactive"></div> & ...
- Kafka usecase
h1, h2, h3, h4, h5, h6, p, blockquote { margin: 5px; padding: 5; } body { font-family: "Helveti ...
- tomcat如何配置context的docBase
docbase是web应用和本地路径,path是tomcat访问这个应用的URL路径.Tomcat的项目部署方式有以下三种:1.直接把项目复制到Tomcat安装目录的webapps目录中,这是最简单的 ...
- 三个Linux权限
Linux有三种不同类型的用户可对文件或目录进行访问,分别是:文件所有者,同组用户.其他用户. 每一文件或目录的访问权限都有三组,每组用三位表示,分别为:1)文件属主的读.写和执行权限:2)和属主同组 ...
- 8.28 jQuery
2018-8-28 18:25:27 jQuery 参考:https://www.cnblogs.com/liwenzhou/p/8178806.html 2018-8-28 19:53:19 还是讲 ...
- win10中强制vs2015使用管理员启动
文章转自: win10中强制vs2015使用管理员启动 首先,和网上流传的版本一样,需要做这下面这两步: 1. 打开VS快捷方式的属性对话框. 2.勾选“用管理员身份运行” 现在,你双击V ...
- Python之时间模块
1,怎么打印时间戳 2,怎么打印日期 3,怎么把字符串转换成python认识的日期 把日期转换成字符串 字符串转换成日期格式 time.strptime("2017-5-16",& ...
- 洛谷P1117 优秀的拆分【Hash】【字符串】【二分】【好难不会】
题目描述 如果一个字符串可以被拆分为AABBAABB的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串aabaabaaaabaabaa,如果令 A=aabA ...
- 20144306《网络对抗》MAL_PC平台逆向破解_Advanced
PC平台逆向破解_Advanced 一.注入shellcode并执行 1.什么是shellcode? shellcode顾名思义就是一段为了获取交互式shell的机器指令,是用来发送到服务器利用特定漏 ...
- bootstrap弹出模态框
(1)引入jquery, bootstrap相关的 jquery下载地址: https://jquery.com/download/ bootstrap下载地址: https://v3.bootcss ...