1.快速排序的基本介绍
快速排序(QuickSort)是对冒泡排序的一种改进。基本思想:通过一趟排序将要排序的数据分隔成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行。
2.快速排序的示意图
3.代码分析
@Test
public void testSort(){
//我们来测一下各种排序速度
int[] array = new int[100000];
for (int i = 0; i < array.length; i++) {
array[i] = (int) (Math.random()*100000);
}
long start = System.currentTimeMillis();
//bubbleSorting(array);//冒泡排序排序100000个数总耗时17984毫秒
//selectSorting(array);//选择排序排序100000个数总耗时3203毫秒
//insertSorting(array);//直接插入排序100000个数总耗时1109毫秒
//shellSortByExchange(array);//希尔的交换排序100000个数总耗时7829毫秒
//shellSortByMove(array);//希尔的移动排序100000个数总耗时16毫秒
quickSort(array,0,array.length-1);//快速排序的移动排序100000个数总耗时31毫秒
long end = System.currentTimeMillis();
System.out.println("总共耗时:"+(end-start));
}
/**
* 快速排序
* @param array 要排序的数组
* @param left 数组的左下标
* @param right 数组的又下标
*/
public void quickSort(int[] array, int left, int right) {
//左指针
int l = left;
//右指针
int r = right;
//得到基准数据
int temp = array[left];
//while循环的目的是找到基准数据再数组中的
//正当位置
while (l < r) {
//当队尾的元素大于基准数据的时候,向前移动右指针
while (l < r && array[r] >= temp) {
r--;
}
//如果队尾的元素有小于temp的,就把他赋值给array[l]
array[l] = array[r];
//当队首的元素小于基准数据的时候,向后移动左指针
while (l < r && array[l] <= temp) {
l++;
}
//如果队首的元素有大于temp的,就把他赋值给array[r]
array[r] = array[l];
}
//当l==r时,就找到了temp的正当位置
array[l] = temp;
//向左递归
if (left < l-1) {
quickSort(array,left,l-1);
}
//向右递归
if (right > r+1) {
quickSort(array,r+1,right);
}
}