快排(基础详解入门)

前言

快排是一种高效的排序方法,虽然思维容易理解,但入门稍有难度。为了方便以后理解,于是写下这篇文章。若文章含有错误,欢迎各位纠正 。 


一、快排的主要内容

1.快排函数(递归)模板

void QuickSort(int a[], int low, int high) {
    int i = low,j = high;
    if(i >= j)  return;
    int temp = a[low];
    while(i != j) {
    while(a[j] >= temp && i < j) j--;
	while(a[i] <= temp && i < j) i++; 
	if(i < j) swap(a[i], a[j]);
    }
    swap(a[low], a[i]);
    QuickSort(a, low, i - 1);
    QuickSort(a, i + 1, high);
}

2.快排中的“key"

key其实就是相当于隔板(模板中则为temp),用于分开两个部分,key往左的部分小于key,反之往右的部分大于key

二、快排解析

1.过程动态分析

快排(基础详解入门)_第1张图片

1.首先挑出快排的key (一般以数组第一个数为key),图中最上方为key。

2.第一轮:从low(最低处)往高处开始,找出第一个大于key的数,假设这个数为a;从high(最高处)往低处开始,找出第一个小于key的数,假设为b。交换a,b的位置。

 快排(基础详解入门)_第2张图片

第二轮:同样从low和high开始遍历,找出a,b并交换位置

     快排(基础详解入门)_第3张图片  

1.第三轮:当从high遍历到达low之前遍历的地方时,也就是完成交接,则以key为基准的分选结束,然后交换key和交接处的位置,结束第一次的快排。

                                                    附上第一次快排代码运行结果

快排(基础详解入门)_第4张图片

 快排整个过程的动态变化

 

2.快排模板分析

 if(i >= j)  return;     说明仅含一个数字,无需快排

int temp = a[low];   选出key

while(i != j) {        当左右遍历交接时结束   

……                                                             

}                                                                 

while(a[j] >= temp && i < j)   j--;   从low往高处遍历
while(a[i] <= temp && i < j)  i++;  从high往低处遍历

if(i < j)   swap(a[i], a[j]);       交换a,b(a,b为以上的值)位置

swap(a[low], a[i]);     交换key与交接处位置

 QuickSort(a, low, i - 1); 对key左边再次快排
 QuickSort(a, i + 1, high);  对key右边再次快排

你可能感兴趣的:(排序算法,算法)