快速排序
- 基本思想:通过一趟排序将记录分为两部分,其中一部分的值均比另一部分小,再对这两部分分别排序
- 时间复杂度:不定,空间复杂度:O(1)
- 相同值排序后顺序不改变,稳定
- 实现思路:(参考了一篇写的非常好的文章)选择一个基准元素,一般为首个元素,记录两端分别设定指针向内靠拢,每次右侧指针先动(可以想想为什么),遇到比基准值小的时候停下,然后左侧指针移动,遇到比基准元素大的值时交换左右指针,遇到右指针时与基准元素交换,此时完成一趟排序。
public class c_QuickSort {
static int num = 0;
public static void main(String[] args) {
int[] arr = {64,85,31,57,54,66,22,22,47};
quickSort(arr,0,arr.length-1);
}
static void quickSort(int[] arr,int low,int high){
int i,j,tag,t;//不要吝啬局部变量,这对解决问题很有帮助
if(low>high){
return;
}
i=low;
j=high;
//tag为基准元素位置
tag = arr[low];
while (i<j) {//此处也可改写为for循环模式
//从右往左依次递减
while (tag<=arr[j]&&i<j) {
j--;
}
//从左往右递减
while (tag>=arr[i]&&i<j) {
i++;
}
//满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = tag;
num++;
System.out.println("第" + num + "趟排序 " + Arrays.toString(arr));
//递归调用
quickSort(arr, low, j-1);
quickSort(arr, j+1, high);
}
}
输出结果
第1趟排序 [22, 47, 31, 57, 54, 22, 64, 66, 85]
第2趟排序 [22, 47, 31, 57, 54, 22, 64, 66, 85]
第3趟排序 [22, 22, 31, 47, 54, 57, 64, 66, 85]
第4趟排序 [22, 22, 31, 47, 54, 57, 64, 66, 85]
第5趟排序 [22, 22, 31, 47, 54, 57, 64, 66, 85]
第6趟排序 [22, 22, 31, 47, 54, 57, 64, 66, 85]
第7趟排序 [22, 22, 31, 47, 54, 57, 64, 66, 85]
第8趟排序 [22, 22, 31, 47, 54, 57, 64, 66, 85]
第9趟排序 [22, 22, 31, 47, 54, 57, 64, 66, 85]