前言
快排是一种高效的排序方法,虽然思维容易理解,但入门稍有难度。为了方便以后理解,于是写下这篇文章。若文章含有错误,欢迎各位纠正 。
一、快排的主要内容
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.首先挑出快排的key (一般以数组第一个数为key),图中最上方为key。
2.第一轮:从low(最低处)往高处开始,找出第一个大于key的数,假设这个数为a;从high(最高处)往低处开始,找出第一个小于key的数,假设为b。交换a,b的位置。
第二轮:同样从low和high开始遍历,找出a,b并交换位置
1.第三轮:当从high遍历到达low之前遍历的地方时,也就是完成交接,则以key为基准的分选结束,然后交换key和交接处的位置,结束第一次的快排。
附上第一次快排代码运行结果
快排整个过程的动态变化
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右边再次快排