基于“交换”的排序:根据序列中两个元素关键字的⽐较结果来对换这两个记录在序列中的位置
算法思想:在待排序表L[1…n]中任取⼀个元素pivot作为枢轴(或基准,通常取⾸元素),通过⼀趟排序将待排序表划 分为独⽴的两部分L[1…k-1]和L[k+1…n],使得L[1…k-1]中的所有元素⼩于pivot,L[k+1…n]中的所有元素⼤于等于 pivot,则pivot放在了其最终位置L(k)上,这个过程称为⼀次“划分”。然后分别递归地对两个⼦表重复上述过程,直⾄ 每部分内只有⼀个元素或空为⽌,即所有元素放在了其最终位置上。
#include<iostream>
using namespace std;
//用第一个元素将待排序序列划分成左右两个部分
int partition(int a[], int low, int high) {
//第一个元素作为枢纽
int pivot = a[low];
while (low < high) {
//比枢纽小的元素移动到左端
while (low < high && a[high] >= pivot) {
high--;
}
a[low] = a[high];
//比枢纽大的元素移动到右端
while (low < high && a[low] <= pivot) {
low++;
}
a[high] = a[low];
}
//每次划分完后枢纽元素回到最终位置,此时low==high
a[low] = pivot;
//返回存放枢纽的最终位置
return low;
}
// 快速排序
void quickSort(int a[], int low, int high) {
if (low < high) { //递归跳出条件
int pivotPosition = partition(a, low, high);
quickSort(a, low, pivotPosition - 1);
quickSort(a, pivotPosition + 1, high);
}
}
void printArr(int a[], int len) {
for (int i = 0; i < len; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
int main() {
int arr[6] = {23, 54, 12, 4, 5,6};
int len = sizeof(arr) / sizeof(int);
printArr(arr, len);
quickSort(arr,0,len - 1);
printArr(arr, len);
}