快速排序
快速排序
QuickSort.h
#include<iostream>
#include<algorithm>
// 返回当前排序的分界点
template <typename T>
int __partition(T arr[], int l, int r){
T v = arr[l];
// j 小于v值元素的最大值索引
// i 当前遍历的节点索引
int i, j = l;
for (i = l + 1; i <= r; i++){
if (arr[i] < v){
j++;
swap(arr[i], arr[j]);
}
}
swap(v, arr[j]);
// cout << "j = " << j << endl;
return j;
}
// 快速排序的递归函数
// 把第一个元素当成分界点标志元素
template <typename T>
void __quickSort(T arr[], int l, int r){
if (l >= r)
return;
int p = __partition(arr, l, r);
__quickSort(arr, l, p-1);
__quickSort(arr, p+1, r);
}
// 快速排序主函数
template <typename T>
void QuickSort(T arr[], int n){
__quickSort(arr, 0, n - 1);
}
test.cpp
#include<iostream>
int main(void){
int arr[] = {4,8,0,3,2,4};
QuickSort(arr, 6);
for (int i = 0; i < 6; i ++){
cout << att[i] << " ";
}
cout << endl;
return 0;
}
这是python写的快排代码
def QuickSort(arr, n):
__quickSort(arr, 0, n - 1)
def __quickSort(arr, l, r):
if l >= r:
return
p = __partition(arr, l, r)
__quickSort(arr, l, p - 1)
__quickSort(arr, p + 1, r)
def __partition(arr, l, r):
j = l
for i in range(l+1, r+1):
if arr[i] < arr[l]:
j +=1
arr[i], arr[j] = arr[j], arr[i]
arr[l], arr[j] = arr[j], arr[l]
return j
def printArray(arr):
print(arr)
if __name__ == '__main__':
arr = [4, 8, 0, 3, 2, 4]
QuickSort(arr, len(arr))
printArray(arr)
过程:
v:分界元素
l:分界元素的索引
i:当前正在遍历的元素索引
j:小于v的最大值的索引
如图所示:
这个步骤就是partition过程