快速排序

来源:互联网 发布:淘宝网妈妈装 编辑:程序博客网 时间:2024/06/01 08:06

快速排序

基本思想:

                快速排序是交换排序的一种。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据小,然后,依次按此方法分割排序,以此达到整个数据变成有序序列。

时间复杂度:

                O(N*logN)    (最坏情况为O(N^2),即为每次选取的key值均为最大或最小;最优情况为O(N*logN),因为对于快排来说,每次都取到最大或最小的key值情况非常少,几乎不可能发生,所以快排时间复杂度为O(N*logN))

空间复杂度:

                O(logN)

稳定性:

                快速排序是不稳定算法

性能:

                快速排序是实用性非常高的排序算法,实现方法也很多,同时快排也有很多需要优化的地方。

                比如:

                1.排序时,每次选取的key值越接近数据中间位置,排序越快,可以通过三数取中方法来实现。

                2.当待排数据特别多,使用递归方法时,每层建立栈帧结构,函数栈帧开销太大,并且有可能出现栈溢出问题,此时可以给小区间使用其他排序算法,比如直接排序,借此来减少函数栈帧开销。

快排动图:

                                                   

递归代码实现:

#include <iostream>#include <Windows.h>#include <assert.h>using namespace std;int PartSort(int* arr, int left, int right);//快速排序,递归实现void QuickSort(int* arr, int left, int right){if (left >= right){return;      //递归出口}int div = PartSort(arr, left, right);QuickSort(arr, left, div - 1);QuickSort(arr, div + 1, right);}int PartSort(int* arr, int left, int right)     //单趟排序,前后指针法{assert(arr);int cur = left;int prev = left - 1;int key = arr[right];while (cur < right)      //均为下标{if (arr[cur] < key){++prev;if (prev != cur){swap(arr[prev], arr[cur]);}}++cur;}//此时出了循环之后,cur==right++prev;swap(arr[prev], arr[right]);return prev;               //返回一个下标,以此作为之后循环分组的依据}void Print(int* arr, int len)     //打印{for (int i = 0; i < len; ++i){cout << arr[i] << "->";}cout << endl;}

#include "QuickSort.h"void TestQuickSort(){int arr[] = { 2, 3, 6, 7, 666, 777, 99, 67, 98, 1, 33, 3333, 28, 7777, 4, 5 };int len = sizeof(arr) / sizeof(arr[0]);cout << "未排序数据:" << "";Print(arr, len);QuickSort(arr, 0, len - 1);cout << "已排序数据:" << "";Print(arr, len);}int main(){TestQuickSort();system("pause");return 0;}


非递归实现:

#include <iostream>  #include <Windows.h>  #include <stack>#include <assert.h>  using namespace std;int PartSort(int* arr, int left, int right);//快速排序,非递归实现  void QuickSort(int* arr, int left, int right){if (arr == NULL){return;}stack<int> tty;tty.push(right);tty.push(left);while (!tty.empty()){int start = tty.top();tty.pop();int end = tty.top();tty.pop();int div = PartSort(arr, start, end);if (start < div - 1){tty.push(div - 1);tty.push(start);}if (div + 1 < end){tty.push(end);tty.push(div + 1);}}}int PartSort(int* arr, int left, int right)     //单趟排序,前后指针法  {assert(arr);int cur = left;int prev = left - 1;int key = arr[right];while (cur < right)      //均为下标  {if (arr[cur] < key){++prev;if (prev != cur){swap(arr[prev], arr[cur]);}}++cur;}//此时出了循环之后,cur==right  ++prev;swap(arr[prev], arr[right]);return prev;               //返回一个下标,以此作为之后循环分组的依据  }void Print(int* arr, int len)     //打印  {for (int i = 0; i < len; ++i){cout << arr[i] << "->";}cout << endl;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 生孩子痔疮脱出不能回纳怎么办 痔疮犯了屁眼疼怎么办 孕晚期得痔疮了怎么办 孕39周痔疮严重怎么办 顺产后长痔疮了怎么办 怀孕了犯痔疮了怎么办 怀孕了痔疮犯了怎么办 痔疮手术后肛裂怎么办 痔疮引起的肛裂怎么办 痔疮手术后伤口不愈合怎么办 痔疮手术后伤口痒怎么办 肛瘘手术十五天后伤口疼怎么办 leep刀后hpv还是阳性怎么办 结肠息肉钳除后怎么办 痔疮手术后排便困难怎么办 住院未结账跑了怎么办 来月经痔疮犯了怎么办 安保压不下宫缩怎么办 肛周脓肿术后假性愈合怎么办 肛门的皱褶肿了怎么办 1月婴儿排便困难怎么办 吃完辣的痔疮肿了怎么办 肛裂怎么办兰州来医博.相信 胎儿脐带绕颈一周怎么办 郑大一附院怎么办合作医疗 痔疮包不消怎么办很疼 痔疮内扎手术后直肠窄小怎么办 2个月大的宝宝鼻塞怎么办 宝宝鼻屎比较深怎么办 来例假痔疮犯了怎么办 微医爽约过一次怎么办 炸完的薯条软了怎么办 学信网号码换了怎么办 学信网注册换手机了怎么办 学信网手机号码已被注册怎么办 学信网手机号码被注册了怎么办 去英国留学不会做饭怎么办 小米陶瓷刀钝了怎么办 橱柜的缝擦不到怎么办 悠悠球上油早了怎么办 买了没有esp的车怎么办