- 原理
建议看 视频讲解🖱️ 理解原理,这里直接总结:
1.设置轴
2.左移找小值,左指针变值,左指针加
3.右移找小值,右指针变值,右指针减
4.轴值等于arr[i]
5.递归左半部分
6.递归右半部分
- 代码
void quickSort(int arr[], int left, int right) {
int temp;
int i = left, j = right;
while (i < j) {
temp = arr[i];
while (i < j && arr[j] >= temp) j--; //"右指针"移动找到第一个小于轴值的数
if (i < j) { //找到后,把值赋给"左指针",并让"左指针"加 1
arr[i] = arr[j];
i++;
}
while (i < j && arr[i] <= temp) i++; //"左指针"移动找到第一个大于轴值的数
if (i < j) { //找到后,把值赋给"右指针",并让"右指针"减 1
arr[j] = arr[i];
j--;
}
arr[i] = temp; //将轴值赋给 R[i]
quickSort(arr, left, i - 1); //递归轴的左半部分
quickSort(arr, i+1, right); //递归轴的右半部分
}
}
- 复杂度
最坏情况时间复杂度:O(n2),最好情况时间复杂度:O(nlog2n),则平均时间复杂度:O(nlog2n)
空间复杂度:O(log2n)
- 实践
#include<stdio.h>
void quickSort(int arr[], int left, int right);
int main() {
int arr[7] = { 1,6,4,7,2,0,7 };
quickSort(arr,0,6);
for (int i = 0; i < 7; i++) {
printf("%d,", arr[i]);
}
}
void quickSort(int arr[], int left, int right) {
int temp;
int i = left, j = right;
while (i < j) {
temp = arr[i];
while (i < j && arr[j] >= temp) j--;
if (i < j) {
arr[i] = arr[j];
i++;
}
while (i < j && arr[i] <= temp) i++;
if (i < j) {
arr[j] = arr[i];
j--;
}
arr[i] = temp;
quickSort(arr, left, i - 1);
quickSort(arr, i+1, right);
}
}
运行结果: