快速排序

来源:互联网 发布:七月算法tensorflow 编辑:程序博客网 时间:2024/06/03 19:52

算法原理

快速排序(Quick Sort)算法的原理如下:
快速排序通过对无序向量进行处理,得到轴点(Pivot)或基准点,再通过轴点将原无序向量划分为两个子无序向量,从而不断减小问题规模。

轴点:在任一向量S中,对某一元素p = S[i],若其满足:
(1)在其之前的元素严格小于p;
(2)在向量S中,恰有i-1个元素不大于p;
则我们称p=S[i]为S的轴点。

很显然,当我们找到一个无序向量的一个轴点时,我们可以以轴点为分界点,划分出两个子向量S1,S2。此时,S1内的元素完全小于轴点,S2内的元素完全不小于轴点。故此时轴点与解无关,从而减小问题规模。

假设原无序向量为S,排序后的有序向量为S’,则轴点如下性质在S、S’中不会发生改变:
(1)轴点的秩
(2)轴点前驱的最大秩
(3)轴点后驱的最小秩

快速排序与归并排序类似,都是通过分治策略进行排序,而快速排序与归并排序的不同之处在于,快速排序可以在O(1)时间里由子问题的解得到原问题的解,但是将原问题分解为子问题却需要O(n)时间,此外,快速排序分解子问题时,往往子问题的规模不一致,甚至有可能出现,子问题与原问题规模一致的最坏情况。

算法分析

快速排序主要难点在于基准的选取,而基准的选取方式往往有多种选择,一般可以选取首位元素,中位元素,末尾元素,还有常见的三数取中法(即先对首中末三个元素进行排序,再选取中位元素进行快排)

快速排序的平均时间复杂度为:O(NlogN),但是存在最坏情况时,时间复杂度则可能为O(N^2),故建议使用三数取中法,尽量防止最坏情况出现。

Code:

#include <iostream>using namespace std;int input[1000];void swap(int & a,int & b){    int tmp = a;    a = b;    b = tmp;    return ;}int Find(int begin, int end, int * data){    int mid = (begin+end)/2;    int tmp[3] ={begin,end,mid};    if (data[tmp[0]]>data[tmp[1]]) swap(tmp[0],tmp[1]);    if (data[tmp[1]]>data[tmp[2]]) swap(tmp[2],tmp[1]);    if (data[tmp[0]]>data[tmp[1]]) swap(tmp[0],tmp[1]);    return tmp[1];}int Find_Pivot(int begin, int end, int *data){    int index = 0;    if (end-begin < 2) index = begin;    else index  = Find(begin,end,data);    swap(data[index],data[begin]);    int key = data[begin], i = begin, j = end;    while (i < j)    {        while (i < j && data[j] <= key) j--;        data[i] = data[j];        while (i < j && data[i] >= key) i++;        data[j] = data[i];    }    data[i] = key;    return i;}void Quick_Sort(int begin, int end, int * data){    if (end-begin < 1) return ;    int pivot = Find_Pivot(begin,end,data);    Quick_Sort(begin,pivot-1,data);    Quick_Sort(pivot+1,end,data);}int main(){    int N;    cin>>N;    for (int n = 0; n < N; n++) cin>>input[n];    Quick_Sort(0,N-1,input);    return 0;}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 内六角扳手不够大怎么办? 苹果6螺丝拧花了怎么办 苹果电脑螺丝拧花了怎么办 苹果螺丝滑牙了怎么办 苹果7螺丝滑丝了怎么办 外六角螺丝滑牙怎么办 六角螺帽滑丝了怎么办 内六角螺丝滑头了怎么办 内六角螺丝滑失了怎么办 内六角螺钉滑了怎么办 三视图看不出来怎么办 小猫断奶以后母猫涨奶怎么办 手机螺丝滑丝了怎么办 螺丝孔道滑丝了怎么办 螺丝生锈了拧不下来怎么办 钣金加工六角网孔变形怎么办 外六角螺帽滑丝怎么办 内六角螺丝螺帽滑丝怎么办 一字螺丝钉脱扣拧不下来怎么办 一字螺丝拧花了怎么办 小螺丝卸不下来怎么办 机油螺丝滑丝了怎么办 刚滑双板膝盖滑的疼怎么办 lv包真皮弄脏了怎么办 lv包压变形了怎么办 lv的包包被压了怎么办 固态硬盘太小了怎么办 联想笔记本网络连接不可用怎么办 联想g50玩dnf卡怎么办 手机有wifi电脑没有网怎么办 电脑网卡被禁用了怎么办 win8系统装win7蓝屏怎么办 联想笔记本装win7蓝屏怎么办 联想g40-70开机黑屏怎么办 新主机开不了机怎么办 联想720s笔记本闪屏怎么办 华硕k40ie显卡坏了怎么办 开机黑屏进入bois后怎么办 2根内存条不兼容怎么办 联想笔记本r720系统崩溃怎么办 联想天逸310卡怎么办