快速排序的基本思想是:
1.先从数组中取出一个数作为基准数。
2.将小于或等于它的数全放到它的左边,大于它的数全放到它的右边。
3.再对左右区间重复第 2 步,直到各区间只有一个数。
更易于理解的排序逻辑是“挖坑+递归”:
请移步此微软大佬的文章:白话经典算法系列之六 快速排序 快速搞定
时间复杂度:O(n2)
//quick_sort.c
#include<stdio.h>
void quick_sort(int arr[], int L, int R) { //L左下标(起点),R右下标(终点)
if (L < R) {
int i = L, j = R, temp = arr[L]; //i,j保存左右下标,temp保存基准数,暂定起点即为基准数。
while (i < j) { //一旦i和j相等,循环结束
while (i < j && arr[j] >= temp) { //从右向左找第一个小于x的数
j--;
}
if (i < j) {
arr[i++] = arr[j]; //存到arr[i]并且i=i+1,牛逼
}
while (i < j && arr[i] < temp) { //从左向右找第一个大于等于x的数
i++;
}
if (i < j) {
arr[j--] = arr[i]; //存到arr[j],并且j=j-1。区间逐渐收缩
}
}
arr[i] = temp; //i和j相遇后,这个位置即为分割点,左边的数都小于temp,右边的数都大于temp。
quick_sort(arr, L, i - 1); //递归i左右的两个区间
quick_sort(arr, i + 1, R);
}
}
int main() {
int arr[] = { 2,9,8,3,7,4,6,1,5 };
int len = 9; //数组长度
quick_sort(arr, 0, len - 1); //排序的起点下标和终点下标
int i;
for (i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
return 0;
}
本文代码运行环境为Visual Studio Community 2019 16.5.0版本。
代码内容主要来自上述微软大佬的文章。
如有疑问或建议,欢迎留言讨论。