快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法是:
1)设置两个变量I、J,排序开始的时候:I=0,J=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即 key=A[0];
3)从J开始向前搜索,即由后开始向前搜索(J=J-1),找到第一个小于key的值a[j],并与key交换;
4)从I开始向后搜索,即由前开始向后搜索(I=I+1),找到第一个大于key的a[i],与key交换;
5)重复第3、4、5步,直到 I=J; (3,4步是在程序中没找到时候j=j-1,i=i+1。找到并交换的时候i, j指针位置不变。另外当i=j这过程一定正好是i+或j+完成的最后另循环结束)
例如:待排序的数组A的值分别是:(初始关键数据:X=49) 注意关键X永远不变.永远是和X进行比较 无论在什么位子 最后的目的就是把X放在中间小的放前面大的放后面
A[0] 、 A[1]、 A[2]、 A[3]、 A[4]、 A[5]、 A[6]:
49 38 65 97 76 13 27
进行第一次交换后: 27 38 65 97 76 13 49
( 按照算法的第三步从后面开始找)
进行第二次交换后: 27 38 49 97 76 13 65
( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时:I=3 )
进行第三次交换后: 27 38 13 97 76 49 65
( 按照算法的第五步将又一次执行算法的第三步从后开始找
进行第四次交换后: 27 38 13 49 76 97 65
( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时:J=4 )
此时再执行第三步的时候就发现I=J,从而结束一趟快速排序,那么经过一趟快速排序之后的结果是:27 38 13 49 76 97 65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。
快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:
初始状态 {49 38 65 97 76 13 27}
进行一次快速排序之后划分为 {27 38 13} 49 {76 97 65}
分别对前后两部分进行快速排序 {27 38 13} 经第三步和第四步交换后变成 {13 27 38} 完成排序。
{76 97 65} 经第三步和第四步交换后变成 {65 76 97} 完成排序。
示例代码
package com.isa.summary;
import java.util.Random;
public class QuickSort {
public static void main(String[] args) {
Random random = new Random();
int[] pData = new int[10];
//随机生成10个数字
for(int i=0;i<pData.length ;i++){
int a = random.nextInt(100);
pData[i] = a;
}
for(int i = 0;i<pData.length;i++){
System.out.println(pData[i]);
}
System.out.println("--------sort -------");
int left = 0;
int right = pData.length-1;
pData = SortArray(pData, left, right);
for(int i = 0;i<pData.length;i++){
System.out.println(pData[i]);
}
}
public static int[] SortArray(int[] pData, int left, int right){
int middle , strTemp;
int i = left;
int j = right;
//随机取数组中间的一个值
middle = pData[(left+right)/2];
do{
//如果选中的值小于中间值 而且 并没有超出数组边界 则继续向右探测
while((pData[i]<middle) && (i<right))
i++;
//如果右边的值大于中间值 而且 并没有超出数组边界, 继续向左
while((pData[j]>middle) && (j>left))
j--;
//左边有值大于中间值 右边有值小于中间值 则这两个值位置互换
if(i<=j){
strTemp = pData[i];
pData[i] = pData[j];
pData[j] = strTemp;
i++;
j--;
}
}while(i<j);
//递归 1/2 个pData进行处理
if(left < j){
SortArray(pData, left, j);
}
if(right > i){
SortArray(pData, i, right);
}
return pData;
}
}
分享到:
相关推荐
知道快速排序算法的思想,但是一直都没有动手写,今天写了下,发现还不是那么容易
快速排序算法,C语言 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有...
快速排序算法(C经典实例) 快速排序算法(C经典实例) 快速排序算法(C经典实例) 快速排序算法(C经典实例) 快速排序算法(C经典实例)
c语言版本的数据结构的快速排序算法,适用于新手学习
快速排序算法C语言实现,快排序算法QuickSort.cpp
快速排序算法c++实现,快速实现插入排序十万个数(调用)。可以改成输入。并附加了程序运行计时,用于测试时间复杂度,可以移除。绝对能用
给定一个数列,用快速排序算法把它排成升序
C++快速排序算法程序,用于处理大量数据, 并对这些数据进行快速的排序
自己写的用C++实现的快速排序算法,运行通过,可以作为参考。
快速排序算法 word格式 较快速度 MATLAB格式
快速排序算法的精确实现 已经编译通过 在VC++6.0上面
快速排序算法的改进思路 1.选取好的基准,是两边的数据个数尽量的均匀 取数组的第一个,中间,最后一个数据,取三个数中第二大的数作为基准 2. 不递归 3.与插入结合,当段内的数组个数小于等于16的时候,使用...
2、单处理机上快速排序算法 3、快速排序算法的性能 4、快速排序算法并行化 5、描述了使用2m个处理器完成对n个输入数据排序的并行算法。 6、在最优的情况下并行算法形成一个高度为logn的排序树 7、完成快速排序的...
详细解释了快速排序的java实现.里面有代码,还有注释说明
资源名:matlab 实现快速排序算法_一共有主程序,分类,插入和选择四个程序 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者...
JAVA冒泡排序和快速排序算法,符合实验报告要求哦
经测试的C++快速排序算法,可直接运行 源代码
1)不做随机化处理的递归实现; 2)采用随机化处理的递归实现; 3)用while循环消除尾递归; 4)用栈模拟递归,并证明所需的栈空间为O(logn); 5) 够小时改用插入排序