【快速排序】
快速排序是冒泡排序的超级升级版,排序过程以{6,1,2,7,9,3,4,5,10,8}为例见下图:
代码实现:
package cn.dataStructureAndAlgorithm.demo.sort;
import java.util.Arrays;
public class 快速排序_QuickSort {
public static void main(String[] args) {
int data[]=new int[]{6,1,2,7,9,3,4,5,10,8};
quickSort(data,0,data.length-1);
System.out.println(Arrays.toString(data));
}
public static void quickSort(int data[],int left,int right){
if (left>right){//左索引大于右索引时,不合法跳出
return;
}
int pivot=data[left];//以最左边的数据做为基准
int temp;//临时交换变量
int l=left;//左索引
int r=right;//右索引
while (l!=r){//当l!=r时,说明一轮排序左右还没排完
while (data[r]>=pivot && r>l){//在左右索引不重合时进行搜索,重合时,暂停右索引移动
//右索引负责寻找右边小于基准的数据
r--;//右索引左移
}
while (data[l]<=pivot && l<r){//只有在左右索引不重合时进行搜索,重合时,暂停左索引移动
//左索引负责寻找左边大于基准的数据
l++;//左索引右移
}
//运行至此处,说明左右都找到需要交换的数据了
temp=data[l];
data[l]=data[r];
data[r]=temp;
}
//运行至此处,说明索引重合了,重合后将重合位置与基准位置交换
data[left]=data[l];
data[l]=pivot;
//在此,整个数列的基准数,左都比他下,右都比他大
//开始递归本轮基准数左右数列
quickSort(data,left,--r);//左递归
quickSort(data,++l,right);//右递归
}
}
快速排序速度测试:以80000000个【0~80000000】的随机整数为数组,进行速度测试(数据以我电脑为准,本次测速与希尔移位式比较,并将数据量*1000)
希尔移位式式耗时:26s 快速排序耗时:10s
快速排序的速度与其基准策略,和初始数据排布息息相关,在数据量小,情况糟糕时不一定特别快。
剩下的排序算法有点复杂难懂,我将其另行整理了,可以点击下面的链接进入查找
排序算法_堆排序,该算法需要学习树的知识,可以在下面的目录链接中,自行查找
【数据结构与算法整理总结目录 :>】<-- 宝藏在此(doge)