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 ...
随机推荐
- docker 镜像详解
镜像的大小不等于通过docker images 看到的每个镜像大小的合集,docker镜像采用了分层的机制.上层使用共同下层,各自不同部门构建各自的独立分层. docker的镜像通过联合文件系统(un ...
- vs 的git插件
在vs2013上Tfs提供的git管理完全无法理解他的管理方式,还是 Git Source Control Provider 好用用. 下载地址: [http://gitscc.codeplex.co ...
- Canvas裁剪Clip和Region、RegionIterator
extends:http://blog.csdn.net/lonelyroamer/article/details/8349601 裁剪功能由Canvas提供的一系列的clip...方法 和quick ...
- Spring加载xsd文件报错:because 1) could not find the document; 2) the document could not be read...
Spring启动时加载xml文件的过程: spring在加载xsd文件时总是先试图在本地查找xsd文件(spring的jar包中已经包含了所有版本的xsd文件),如果没有找到,才会转向去URL指定的路 ...
- 8.11 数据库ORM(5)
2018-8-11 20:43:52 昨天从俺弟家回来了. 和俺弟聊天发现,他一直停留在自己目前的圈子,自己觉得很牛逼,比别人高人一等,, 读书无用论,,可以用 幸存者偏激理论 大概就是这个 可以否决 ...
- mysql union查询
1.mysql总是通过创建并填充临时表来执行union查询; 2.除非要服务器消除重复的行,否则一定要用union all.如果没有all关键字,mysql会在临时表加个distinct选项,会导致临 ...
- mysql 小于等于0 不包含null
SELECT count(*) FROM test2 WHERE num<=1;
- Web开发中需要了解的东西【转载】
在StackExchange上有人问了这样一个问题:What should every programmer know about web development?(关于Web开发,什么是所有程序员需 ...
- PAT-GPLT L1-033 - 出生年 - [简单模拟]
题目链接:https://www.patest.cn/contests/gplt/L1-033 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standar ...
- array string mysql IN LIKE
$ids = $_POST['ids']; $str = implode(',',$ids); $str = '('.$str.')'; $db_region->region_del($str) ...