常见排序算法流程分析及其实现代码(五)

164 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

快速排序

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);	
	}
}

20200901120803925.png

3、性能分析

时间复杂度:O(nlog2n) 空间复杂度:O(log2n) 稳定性:不稳定