C语言中的快速排序
我将详细解释快速排序算法的工作原理以及上述C语言代码的实现过程。
快速排序是一种高效的排序算法,它采用分治策略(Divide and Conquer)来对一个序列进行排序。快速排序的基本思想是选择一个元素作为"基准"(pivot),通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
c
#include <stdio.h>
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // pivot
int i = (low - 1); // Index of smaller element
for (int j = low; j <= high - 1; j++) {
// If current element is smaller than the pivot
if (arr[j] < pivot) {
i++; // increment index of smaller element
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) {
/* pi is partitioning index, arr[p] is now
at right place */
int pi = partition(arr, low, high);
// Separately sort elements before
// partition and after partition
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
void printArray(int arr[], int size) {
int i;
for (i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
int main() {
int n;
printf("Enter number of elements in the array:\n");
scanf("%d", &n);
int arr[n]; // Create an array with given number of elements
printf("Enter %d integers:\n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
quickSort(arr, 0, n - 1);
printf("Sorted array: \n");
printArray(arr, n);
return 0;
}
以下是快速排序的步骤:
1. 选择基准:在数据集之中,选择一个元素作为"基准"(pivot)。
2. 分区操作:将数组进行分区(partition),将小于基准的元素移到基准的左边,将大于基准的元素移到基准的右边。分区完成后,基准元素所处的位置就是最终排序后它的位置。
3. 递归排序:递归地将小于基准的元素的子序列和大于基准的元素的子序列排序。
4. 合并:因为子序列的排序是就地进行的,所以不需要合并操作,整个数组就变成了有序的。
C语言代码实现解释
1. swap函数:swap函数接受两个整型指针作为参数,用于交换两个变量的值。
void swap(int* a, int* b) {
int t = *a;
*a = *b;
*b = t;
}
2. partition函数:partition函数执行分区操作,它选择数组的最后一个元素作为基准,然后重新排列数组,使得所有小于基准的元素都位于基准的左边,所有大于基准的元素都位于基准的右边。函数返回基准元素最终所在位置的索引。
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // pivot
int i = (low - 1); // Index of smaller element
for (int j = low; j <= high - 1; j++) {
// If current element is smaller than the pivot
if (arr[j] < pivot) {
i++; // increment index of smaller element
swap(&arr[i], &arr[j]);
}
}
swap(&arr[i + 1], &arr[high]);
return (i + 1);
}
3. quickSort函数:quickSort函数是递归函数,它使用partition函数来找到基准的正确位置,并递归地对基准左右两边的子数组进行排序。
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);
}
}
4. printArray函数:printArray函数用于打印数组中的所有元素。
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++)
printf("%d ", arr[i]);
printf("\n");
}
5. main函数:main函数是程序的入口点,它负责接收用户输入的数组大小和数组元素,调用quickSort函数对数组进行排序,并最后调用printArray函数打印排序后的数组。
int main() {
int n;
printf("Enter number of elements in the array:\n");
scanf("%d", &n);
int arr[n]; // Create an array with given number of elements
printf("Enter %d integers:\n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
quickSort(arr, 0, n - 1);
printf("Sorted array: \n");
printArray(arr, n);
return 0;
}