算法_快速排序算法C/C++
目录
快速排序
1. 算法思想
2. 实现原理
3. 动态演示
4. 完整代码
5. 结果展示
6. 算法分析
快速排序
1. 算法思想
快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
2. 实现原理
2.1、设置两个变量 low、high,排序开始时:low=0,high=size-1。
2.2、整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面
- 默认数组的第一个数为基准数据,赋值给key,即key=array[low]。
- 因为默认数组的第一个数为基准,所以从后面开始向前搜索(high–),找到第一个小于key的array[high],就将 array[high] 赋给 array[low],即 array[low] = array[high]。(循环条件是 array[high] >= key;结束时 array[high] < key)
- 此时从前面开始向后搜索(low++),找到第一个大于key的array[low],就将 array[low] 赋给 array[high],即 array[high] = array[low]。(循环条件是 array[low] <= key;结束时 array[low] > key)
- 循环 2-3 步骤,直到 low=high,该位置就是基准位置。
- 把基准数据赋给当前位置。
2.3、第一趟找到的基准位置,作为下一趟的分界点。
2.4、递归调用(recursive)分界点前和分界点后的子数组排序,重复2.2、2.3、2.4的步骤。
2.5、最终就会得到排序好的数组。
3. 动态演示
4. 完整代码
#include <stdio.h>
#include <stdlib.h>void display(int* array, int size) {for (int i = 0; i < size; i++) {printf("%d ", array[i]);}printf("\n");
}int getStandard(int array[], int i, int j) {// 基准数据int key = array[i]; // 每一次执行该函数,为一个key找到正确的位置while (i < j) {// 因为默认基准是从左边开始,所以从右边开始比较// 当队尾的元素大于等于基准数据 时,就一直向前挪动 j 指针while (i < j && array[j] >= key) {j--;}// 当找到比 array[i] 小的时,就把后面的值 array[j] 赋给它if (i < j) {array[i] = array[j];}// 当队首元素小于等于基准数据 时,就一直向后挪动 i 指针while (i < j && array[i] <= key) {i++;}// 当找到比 array[j] 大的时,就把前面的值 array[i] 赋给它if (i < j) {array[j] = array[i];}}// 跳出循环时 i 和 j 相等,此时的 i 或 j 就是 key 的正确索引位置// 把基准数据赋给正确位置array[i] = key;return i;
}void QuickSort(int array[], int low, int high) {// 开始默认基准为 lowif (low < high) {// 分段位置下标int standard = getStandard(array, low, high);// 递归调用排序// 左边排序QuickSort(array, low, standard - 1);// 右边排序QuickSort(array, standard + 1, high);}
}// 合并到一起快速排序
// void QuickSort(int array[], int low, int high) {
// if (low < high) {
// int i = low;
// int j = high;
// int key = array[i];
// while (i < j) {
// while (i < j && array[j] >= key) {
// j--;
// }
// if (i < j) {
// array[i] = array[j];
// }
// while (i < j && array[i] <= key) {
// i++;
// }
// if (i < j) {
// array[j] = array[i];
// }
// }
// array[i] = key;
// QuickSort(array, low, i - 1);
// QuickSort(array, i + 1, high);
// }
// }int main() {int array[] = {49, 38, 65, 97, 76, 13, 27, 49, 10};int size = sizeof(array) / sizeof(int);// 打印数据printf("%d \n", size);QuickSort(array, 0, size - 1);display(array, size);// int size = 20;// int array[20] = {0}; // 数组初始化// for (int i = 0; i < 10; i++) { // 数组个数// for (int j = 0; j < size; j++) { // 数组大小// array[j] = rand() % 1000; // 随机生成数大小 0~999// }// printf("原来的数组:");// display(array, size);// QuickSort(array, 0, size - 1);// printf("排序后数组:");// display(array, size);// printf("\n");// }return 0;
}
5. 结果展示
6. 算法分析
算法_快速排序算法C/C++相关推荐
- cb32a_c++_STL_算法_查找算法_(5)adjacent_find
cb32a_c++_STL_算法_查找算法_(5)adjacent_find adjacent_find(b,e),b,begin(),e,end() adjacent_find(b,e,p),p-p ...
- 常用十大算法_回溯算法
回溯算法 回溯算法已经在前面详细的分析过了,详见猛击此处. 简单的讲: 回溯算法是一种局部暴力的枚举算法 循环中,若条件满足,进入递归,开启下一次流程,若条件不满足,就不进行递归,转而进行上一次流程. ...
- java sort算法名称_快速排序算法(Quick Sort)(java)
/** * 快速排序算法是基于分治策略的一种排序算法,下面是一个递归的快速排序. * @author liuy */ public class QuickSort { public static vo ...
- 时间复杂度为on的排序算法_快速排序的时间复杂度为啥是为O(nlogn)
本科学过数据结构课程的同学都知道快速排序最好情况下的时间复杂度 ,最坏情况下的时间复杂度为 . 但是大部分书上都没有介绍如何计算快速排序的时间复杂度, 今天我们就来简单推导一下快速排序的时间复杂度. ...
- python实现快速排序算法_基础算法:快速排序(python实现)
算法原理 快速排序是一个具有较高性能的排序算法,其主要思想如下: 对数组中的某个元素,确定其在数组中的排序位置,即在其之前的所有元素均小于该元素,在其之后的均大于该元素.对小元素组和大元素组同样执行该 ...
- java快速排序泛型_泛型算法_快速排序源码
#include using namespace std;int a[1000000];void qsort(int l,int r){int x=a[l];int i=l;int j=r;if(l& ...
- python语言基本排序算法_排序算法(Python)
参考: <数据结构(Python 语言描述)> - 3.4 基本排序算法.3.5 更快的排序 Tips:为了保持简洁,每个函数都只处理整数列表,并且假设列表不为空. 目录.jpg 术语 1 ...
- 【算法】快速排序算法的编码和优化
参考资料 <算法(第4版)> - - Robert Sedgewick, Kevin Wayne <啊哈! 算法> - - 啊哈磊 ...
- 【大话数据结构算法】快速排序算法
快速排序是交换类的排序,比如在站队的时候,老师说:"第一个同学出列,其他同学以第一个同学为中心,比他矮的全排在左边,比他高的全排在右边."这就是一趟快速排序.可以看出,一趟快速排序 ...
- linux公社 java算法_Java快速排序算法
快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 ...
最新文章
- MSSQL差异备份取系统权限
- 搜狗2012.9.23校园招聘会笔试题
- linux-vim-文本编辑
- python用牛顿迭代法求平方根_Python编程实现二分法和牛顿迭代法求平方根代码
- 如何销毁一个实例化对象_基于脚本的游戏对象系统(1) 实例化、组件及生命周期...
- 小程序引发的深层思考
- Java回调网址_极光短信- 回调接口 - 极光文档
- 20145209 《信息安全系统设计基础》第13周学习总结
- gcc for linux安装失败,安装错误的gcc导致一些错误
- VC调用3dmax自动化对象
- bootice添加黑苹果引导_黑苹果OC(OpenCore)引导升级教程
- 计算机论文的研究思路与方法,计算机毕业论文开题报告教学网站的设计与实现...
- python控制灯开关_通过树莓派控制电灯开关
- CPA、CPS、CPC、CPM推广是什么意思
- java文件一行一行读取_Java代码中如何一行一行的读取文本文件呢?
- 在html中dd 是什么列表,html中dt dd
- obs多推流地址_最热门直播工具OBS的下载和设置教程,值得一看
- linux命令之一 diff(2) 命令用法
- 比Worktile更适合软件研发的项目管理系统有哪些?10大项目管理系统对比
- C#中out和ref使用的区别
热门文章
- 【转】浅谈命令查询职责分离(CQRS)模式
- Python中的get和set方法
- Flume案例之采集特定目录的数据到HDFS
- 1.为什么 要需要变量。二进制,方便,2.变量是什么 ,3.声明变量
- 使用gc、objgraph干掉python内存泄露与循环引用!
- 使用.net开发并生成Windows服务安装包
- Uploadify—借助Uploadify插件实现图片预览时如何解决Chrome浏览器报“喔唷,崩溃啦”
- MEncoder的基础用法—6.2. 选择输入文件或设备
- winform 文件上传限制文件类型及文件大小
- 如何阅读《深入理解计算机系统》这本书?