本文已参与「新人创作礼」活动,一起开启掘金创作之路
快速排序
1、执行流程
每趟排序选择第一个元素作为枢纽,并分别将 i,j 两个变量指向首尾两个元素
首先从 j 开始向前扫描
当 j 所指向的元素小于枢纽值时,将 j 所指向的值赋给 i 所指向的位置,变换扫描方向,由 i 向后扫描
当 i 所指向的元素 大于枢纽值时,将 i 所指向的值赋给 j 所指向的位置,变换扫描方向,由 j 向前扫描
当 i=j 时,枢纽位置最终确定(枢纽前的所有元素均小于枢纽的值,枢纽后的元素均大于枢纽的值),再继续分别对枢纽前后的序列进行排序即可得出最终结果
原始序列:49 38 65 97 76 13 27 49 (序列中有两个49,其中一个加粗加以区分并可以验证该排序算法稳定性)
1)第一趟,将第一个数49作为枢纽,i,j分别指向首尾元素
49 38 65 97 76 13 27 49 i j
j 由后向前扫描,扫描到27时小于枢纽值,27<49,将27放在 i 的位置
49 38 65 97 76 13 27 49 i j
27 38 65 97 76 13 49 i j
变换扫描方向,由 i 向后扫描,扫描到65时大于枢纽值,65>49,将65放在 j 所指向的位置
27 38 65 97 76 13 49 i j
27 38 97 76 13 65 49 i j
变换扫描方向,由 j 向前扫描,扫描到13时小于枢纽值,13<49,将13放在 i 所指向的位置
27 38 97 76 13 65 49 i j
27 38 13 97 76 65 49 i j
变换扫描方向,由 i 向后扫描,扫描到97时大于枢纽值,97>49,将97放在 j 所指向的位置
27 38 13 97 76 65 49 i j
27 38 13 76 97 65 49 i j
变换扫描方向,由 j 向前扫描,当 i=j 时,扫描结束,将49枢纽值放入
27 38 13 76 97 65 49 ij
27 38 13 49 76 97 65 49 ij
第一趟结束可以看出,ij 所指的49左边均小于49,右边均大于49,再继续对这两个序列进行排序,最终即可得到有序序列
2、执行代码
public class QuickSort {
static int count = 0;
public static void sort(int num[], int low, int high) {
int temp, k;
int i = low, j = high;
if(low < high) {
temp = num[low];
while(i < j) {
while(j > i && num[j] >= temp) {
j--;
}
if(i < j) {
num[i] = num[j];
i++;
}
while(i < j && num[i] < temp) {
i++;
}
if(i < j) {
num[j] = num[i];
j--;
}
}
num[i] = temp;
count++;
System.out.print("第"+count+"趟:");
for(k = 0; k < num.length; k++) {
System.out.print(num[k] + " ");
}
System.out.println();
sort(num, low, i-1);
sort(num, i+1, high);
}
}
public static void main(String[] args) {
int mynum[] = {49, 38, 65, 97, 76, 13, 27, 49};
sort(mynum, 0, mynum.length-1);
}
}
3、性能分析
时间复杂度:O(nlog2n)
空间复杂度:O(log2n)
稳定性:不稳定