排序算法 之 快速排序

快速排序是基于分治思想的一种排序算法,就像该方法的名字一样,速度比较快,所以叫做快速排序;它的平均时间复杂度为O(N*logN),最坏时间复杂度为O(n2),由于快速排序在序列元素数量多的时候速度比较快,所以很多语言内置的排序方法也是用快速排序实现的。快速排序也有很多优化的版本,比如在排序时基数的选择等等…下面就说一下一般的快速排序的实现。

基本思想:

快速排序的基本思想就是,先从待排序的序列中任选一个元素作为基数,然后将序列中的其他小于基数的元素放在基数的左边,大于或等于基数的元素放在基数的右边,第一次的时候虽然序列中的左半部分中的元素都小于基数,序列中右半部分中的元素都大于或等于基数,但这两部分内部元素并不一定是有序的,不要紧,只要我们把左右两半部分序列分别继续执行第一步,这样不断的把序列分解然后排序,直到分到最后所分解的序列中元素的数量都为1,则排序完成序列有序。

下面看图:这是一个待排序的序列












5 2 6 1 7 8 4 9 3

第一步,选择基数,一般选择序列的首个元素为基数,这里选择首个元素5为基数,并记录在临时变量中,记录此时序列的起始位置下标i=0,结束位置下标j=8;

第二步,从位置j开始向左找,每移动一个位置j--,当找出一个小于基数的元素时把该元素放入刚才选择基数的位置即(i=0),同时使i++;如下图:












3 2 6 1 7 8 4 9 3

第三步,从位置i开始向右找,每移动一个位置i++,当找出一个大于或等于基数的元素时把该元素放入位置j,同时j—;如下图:












3 2 6 1 7 8 4 9 6

第四步,重复执行第二、第三步直至i==j时结束,然后把基数放入位置i;最后如下图:












3 2 4 1 5 8 7 9 6

第五步,将基数左右两边的序列重复执行第一、二、三、四、五步直至最后分解的所有序列中元素数量都为1则排序结束序列有序。

有了上面的分析过程下面看代码实现:


/// <summary>
/// 快速排序
/// </summary>
/// <param name="intArray"></param>
/// <param name="left"></param>
/// <param name="right"></param>
public static void QuickSort(int[] intArray, int left, int right)
{
if (left < right)
{
int i = left, j = right, x = intArray[left];
while (i < j)
{
//从右向左找小于x的数来填intArray[i]
while (i < j && intArray[j] >= x)
{
j--;
}
if (i < j)
{
intArray[i] = intArray[j];
i++;
}

//从左向右找大于或等于x的数来填intArray[j]
while (i < j && intArray[i] < x)
{
i++;
}
if (i < j)
{
intArray[j] = intArray[i];
j--;
}
}//退出循环时 i==j
intArray[i] = x;
QuickSort(intArray, left, i - 1);
QuickSort(intArray, i + 1, right);
}
}

当调用时left传入序列开始的下标即0,right传入序列结束的下标即(长度-1);

以上就是快速排序的实现。

排序算法 之 快速排序,布布扣,bubuko.com

时间: 2024-10-12 09:48:39

排序算法 之 快速排序的相关文章

常用排序算法之——快速排序(C语言+VC6.0平台)

经典排序算法中快速排序具有较好的效率,但其实现思路相对较难理解. #include<stdio.h> int partition(int num[],int low,int high) //以key为基准 将待排数列“高”.“低 ”两部分,“高”部分的所有数据比key大,“低”部分的数据都比key小 { int left,right,key; left=low;right=high;key=num[low]; while(left<right) { while(left<right

常用排序算法之——快速排序

快速排序的原理: 首先找一个标兵值,等于某一个元素值:遍历数组,将数组分为小于标兵值和大于标兵值的两部分:然后分别对两个部分采用快速排序,递归. 分开数组时,维持一个指针,指向已找到小部分的最后一个元素:一个指针用于遍历. 不稳定排序算法.当数组已经有序时,时间复杂度最差,为O(N2),平均.最优情况下都为O(N lgN). 代码如下: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T> 5 v

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

记录学习点滴 快速排序算法是一种很有趣的算法,短小精悍,性能强劲,对于大部分情况都可以胜任,但对极端环境难以应付. 快速排序我理解为:这是一个“以自我为中心的”+“分治法”思想的算法. 分治法不必多说,化繁为简,那就是逐个击破. 那什么是“以自我为中心”?顾名思义,就是每次都一个“我”,每个人都要围绕“我”行事,比“我”小的都去左边站着,比“我”他大的都去右边站着,而且“我”不去关心每一边都有谁,反正你没“我”大或者小就行.一旦“我”落位了妥帖了,“我”就不动了.然后再在左右两边分别产生新“我”

排序算法之快速排序Java实现

排序算法之快速排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序:http://t.cn/hros0W  快速排序:http://t.cn/ScTA1d  归并排序:http://t.cn/Sc1cGZ 快速排序是一个就地排序,分而治之,大规模递归的算法.从本质上来说,它是归并排序的就地版本. 1.快速排序可以由下面四步组成:(1) 如果不多于1个数据,直接返回.(2

经典排序算法之快速排序(C语言版)

快速排序是一种很常用的排序算法. /*  * 快速排序(伪算法) 2016-04-20 23:34:16  * 1.先找到第一个元素的最终位置  * 2.对第一个元素的最终位置之前的元素,进行快速排序.  * 3.对第一个元素的最终位置之后的元素,进行快速排序.  * */ extern void QuickSort(int a[],int low,int high);//第二个参数表示第一个元素的下标,第三个参数表示最后一个元素的下标 extern int FindPos(int a[], i

排序算法之快速排序的随机化版本

4.3 快速排序的随机化版本 这种方法并不是一种全新的排序算法,而是在快速排序的基础上加入随机化的因素,因素,因而仍然将其作为第四种方法(快速排序)的一种补充. 为什么要提出快速排序的随机化版本,主要是对于快速排序法其划分情况的好坏会直接影响排序的效率,而且,快速排序的平均性能较好,所以,加入随机化成分,可以使该算法对于所有输入均能获得较好的平均情况性能. 针对加入随机化的环节,选取的是选取主元的环节,因为主元的选取直接影响快速排序算法的数组划分. C代码实现为: #include <stdio

排序算法之快速排序(Quicksort)解析

一.快速排序算法的优点,为什么称之为快排? Quicksort是对归并排序算法的优化,继承了归并排序的优点,同样应用了分治思想. 所谓的分治思想就是对一个问题“分而治之”,用分治思想来解决问题需要两个步骤: 1.如何“分”?(如何缩小问题的规模) 2.如何“治”?(如何解决子问题) 快排的前身是归并,而正是因为归并存在不可忽视的缺点,才产生了快排.归并的最大问题是需要额外的存储空间,并且由于合并过程不确定,致使每个元素在序列中的最终位置上不可预知的.针对这一点,快速排序提出了新的思路:把更多的时

Python实现排序算法之快速排序

Python实现排序算法:快速排序.冒泡排序.插入排序.选择排序.堆排序.归并排序和希尔排序 Python实现快速排序 原理 首先选取任意一个数据(通常选取数组的第一个数)作为关键数据,然后将所有比它小的放到它前面,所有比它大的放到它后面,这个过程称为一趟快速排序 快速排序原理图如下: 实现 #coding=utf-8 #python实现快速排序 def quick_sort(li,start,end): if start < end: flag = li[start] print(flag)

数据结构排序算法之快速排序

排序算法包括很多种,其中快速排序是其中一种比较快的排序算法,今天就来介绍一下: 快速排序的基本实现思想就是将当前待排序列分成两个部分.一个值.一个值:就是选定出一个值作为被比较的元素.两个部分:所有比该被选定元素大的部分都去该元素的右边,所有比被选定元素小的部分都去该元素的左边.这样我们就确定了该元素在这个待排序列中的位置,其实也就是我们已经将这个元素“排好了”. 那么,怎么才能完成一次的快速排序呢? 我们选定一个被比较的元素,一般都是选第一个,即数组中第一个元素作为val,然后我们给出两个指针