快速排序算法sort分析

快速排序的思想是分治法的思想。

一般是按照这个序列的首元素为 mid 基准,把比比mid大的元素放在后面。比 mid 小的元素放前面。然后依次递归,把在 mid 前面的所有元素当成一个新的序列进行刚才的操作,在mid后面的元素看成一个新的序列也进行这样的操作,直到这样得到的序列为一个元素。则排序完成。

当然为基准的元素不一定非要是1:首元素,也可以选2:末尾元素,或者3中间位置元素,4取首、末、中的中间值,4、取一个随机数。当然这个基准选取的好的话算法的效率会不同,最好是每次取一个所有元素排序之后的中间元素,这样算法的效率最高。

加入我们以序列 49,38,65,97,76,13,27 为例,取首元素为基准。

经过第一次划分得到【27,38,13】 49 【76 97 65】

然后前面序列为27为基准【13】27 【38】  后面元素以76为基准 得到【65】 76 【97】

这样元素就有序了。

可见,算法其实很简单,分治法策略这些可以用一个递归函数来实现,

void Qsort(int low,int high)
{
    int mid;
    if(low<high)
    {
        mid = Partition(low,high);
        Qsort(low,mid-1);
        Qsort(mid+1,high);
    }
}

接下来是按照基准划分了。这样来实现

int Partition(int low,int high)
{
    int i = low,j = high,pivot = num[low];
    while(i<j)
    {
        while(i<j && num[j]>=pivot)
            j--;
        if(i<j)
            swap(num[i++],num[j]);
        while(i<j && num[i]<=pivot)
            i++;
        if(i<j)
            swap(num[i],num[j--]);
    }
    return j;
}

这样就实现了快速排序

#include <iostream>
#include <cstdio>
using namespace std;
int num[500];
int Partition(int low,int high)
{
    int i = low,j = high,pivot = num[low];
    while(i<j)
    {
        while(i<j && num[j]>=pivot)
            j--;
        if(i<j)
            swap(num[i++],num[j]);
        while(i<j && num[i]<=pivot)
            i++;
        if(i<j)
            swap(num[i],num[j--]);
    }
    return j;
}
void Qsort(int low,int high)
{
    int mid;
    if(low<high)
    {
        mid = Partition(low,high);
        Qsort(low,mid-1);
        Qsort(mid+1,high);
    }
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
            scanf("%d",&num[i]);
        Qsort(0,n-1);
        for(int i=0;i<n;i++)
            printf("%d%c",num[i],i==(n-1)?'\n':' ');
    }
    return 0;
}
时间: 2024-11-06 14:28:41

快速排序算法sort分析的相关文章

C语言快速排序算法代码分析

最近在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,很来发现设计模式真的很重要.有的时候代码的可维护.可重用.可扩展确实胜过单纯的算法效率高.所以拾起大牛书籍<大话设计模式>同时参考网上诸大牛的博客,开始我的设计模式之旅.由于平时编程时用C/C++,现在是Java,也练练Java语法. 今天先介绍一下命令模式. 概念: 命令模式(Command):将一个请求封装成一个对象,从而使你可用不同的请求对象对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作.

算法---快速排序(quick sort)

在前面介绍的排序算法中,最快的排序算法为归并排序,但是归并排序有一个缺陷就是排序过程中需要O(N)的额外空间.本文介绍的快速排序算法时一种原地排序算法,所需的额外空间复杂度为O(1). 算法介绍:快速排序其实一种根据需找某个元素的具体位置进行排序的方法.比如所存在如下数组 选择第一个元素5,找到5最终的位置,即5的左边的数都小于或者等于5,右边的数都大于或者等于5. 从"6"开始,可知6大于5,此处停住,从"2"开始2小于5,因此交换6与2的位置,然后接着往下走,将

经典排序算法 - 快速排序Quick sort

经典排序算法 - 快速排序Quick sort 原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 举个例子 如无序数组[6 2 4 1 5 9] a),先把第一项[6]取出来, 用[6]依次与其余项进行比较, 如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边 如果比[6]大就放[6]后边,9比[6]大,放到[6

各种排序算法的分析及java实现

各种排序算法的分析及java实现 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几类: (1).插入排序:直接插入排序.二分法插入排序.希尔排序. (2).

STL算法 — sort

能使用STL的sort系列算法的前提是容器的迭代器必须为随机迭代器.所以,vector和deque天然适用.STL的sort算法采用了一些策略,在不同情况下采用不同的排序算法,以达到各种算法优势互补的效果.基本的原则是:数据量大时采用快速排序,数据量小时采用插入排序(这是对快排常用的一种优化策略),递归层次过深改用堆排序. 首先是插入排序.它的平均和最坏时间复杂度都为O(N2),量级小于千,那么插入排序还是一个不错的选择.SGI STL的插入排序默认以增序排列,另外还可以传入一个仿函数作为比较规

【排序】快速排序算法

特别说明: 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构. 快速排序介绍 快速排序算法相较于插入.冒泡.选择排序来说而言要稍微复杂些.其主要用的是分治思想,将问题划分为更小的子问题来解决.因此,快速排序的思想其实很简单.在(目前的)时间复杂度为  的排序算法中,快速排序的系数是最小的.因此,在平均情况下,快速排序算法是被认为最快的一种排序算法(要不怎么称之为快速排序呢?). 快速排序算法在大数据量情况下,实践证明在平均情况下的排序算法

java算法系列之一:快速排序算法

1.算法概念. 快速排序(Quicksort)是对冒泡排序的一种改进.由C. A. R. Hoare在1962年提出. 2.算法思想. 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 3.实现思路. ①以第一个关键字 K 1 为控制字,将 [K 1 ,K 2 ,-,K n ] 分成两个子区,使左区所有关键字小于等于 K 1 ,右区所有关键字大于

排序算法系列:快速排序算法

概述 在前面说到了两个关于交换排序的算法:冒泡排序与奇偶排序. 本文就来说说交换排序的最后一拍:快速排序算法.之所以说它是快速的原因,不是因为它比其他的排序算法都要快.而是从实践中证明了快速排序在平均性能上的确是比其他算法要快一些,不然快速一说岂不是在乱说? 本文就其原理.过程及实现几个方面讲解一下快速排序算法. 版权声明 著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:Coding-Naga 发表日期:2016年3月1日 链接:http://blog.csdn.n

[转]各种排序算法的分析及java实现

原文:http://www.cnblogs.com/liuling/p/2013-7-24-01.html 排序一直以来都是让我很头疼的事,以前上<数据结构>打酱油去了,整个学期下来才勉强能写出个冒泡排序.由于下半年要准备工作了,也知道排序算法的重要性(据说是面试必问的知识点),所以又花了点时间重新研究了一下. 排序大的分类可以分为两种:内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.下面讲的排序都是属于内排序. 内排序有可以分为以下几