快速排序

快速排序算法的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以达到整个数据变成有序序列。

  1. 选择基准:从数组中选择一个元素作为基准(通常选择第一个元素、最后一个元素或中间元素)。
  2. 划分:重新排序数组,使得所有小于基准的元素都移到基准的左侧,所有大于基准的元素都移到基准的右侧。在这个过程中,基准元素最终会处于其正确的位置。
  3. 递归排序:分别对基准左侧和右侧的子数组进行递归排序。
#include <stdio.h>

// 交换两个整数的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}

// 划分函数
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // 选择最后一个元素作为基准
int i = (low - 1); // i 是小于基准的元素的最后一个位置

for (int j = low; j <= high - 1; j++) {
if (arr[j] < pivot) {
i++; // 增加小于基准的元素的索引
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}

// 快速排序函数
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high); // 划分点

// 递归排序划分点左侧和右侧的子数组
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}

// 打印数组
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}

int main() {
int arr[] = {10, 7, 8, 9, 1, 5};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
printf("排序后的数组: \n");
printArray(arr, n);
return 0;
}