快速排序
- 分而自治的思想,将数据分为两部分,一部分为大于基准值,一部分小于基准值。
- 通过递归的方式,调用排序算法,小于部分在左边,大于部分在右边。
- 左右边的数据,单独再排序,先拍完左边数据后右边数据。
图解
部分运行 流程
首次递归将数组分为大于和小于4的两部分,然后在左右分别递归排序。
附上代码
#include <stdio.h>
#include <stdlib.h>
void show_sort(int arr[], int low, int high)
{
for (int i=low; i <= high; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int get_middle(int arr[], int low, int high)
{
int temp = arr[low]; // 将当前组的 首位值 作为基准值
while (low < high)
{
while (low < high && temp <= arr[high])
{
high--; // 从右向左 找到比 基准值小的值
}
arr[low] = arr[high]; // 放到到左边
while (low < high && temp >= arr[low])
{
low++; // 从左向右 找到比 基准值大的值
}
arr[high] = arr[low]; // 放到右边
}
arr[low] = temp; // 恢复 基准值
return low; // 返回基准值的位置
}
void quick_sort(int arr[], int low, int high)
{
if (low < high)
{
int middle = get_middle(arr, low, high); // 获得基准值
quick_sort(arr, low, middle - 1); // 小于基准值的递归调用
quick_sort(arr, middle + 1, high); // 大于基准值的递归调用
}
}
int main()
{
int arr[10] = {4,5,2,7,1,8,3,9,0,6};
printf("初始化数据:\n");
show_sort(arr, 0, 9);
quick_sort(arr, 0 , 10-1);
printf("完成排序:\n");
show_sort(arr, 0, 9);
return 0;
}