提示信息

快速排序算法的多种实现方式(C语言)

无名城市 已关注

快速排序算法是一种高效的排序算法,基于分治法的思想。快速排序的基本思想是选择一个“基准”元素,通过一趟排序将要排序的数组划分成两个子数组,其中一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素,然后递归地对这两个子数组进行排序。下面是几种在C语言中的实现方式:

1. 标准实现(递归)

这是最基本和常见的快速排序实现:

  1. #include <stdio.h>
  2. void swap(int *a, int *b) {
  3. int temp = *a;
  4. *a = *b;
  5. *b = temp;
  6. }
  7. int partition(int arr[], int low, int high) {
  8. int pivot = arr[high];
  9. int i = low - 1;
  10. for (int j = low; j < high; j++) {
  11. if (arr[j] <= pivot) {
  12. i++;
  13. swap(&arr[i], &arr[j]);
  14. }
  15. }
  16. swap(&arr[i + 1], &arr[high]);
  17. return i + 1;
  18. }
  19. void quickSort(int arr[], int low, int high) {
  20. if (low < high) {
  21. int pi = partition(arr, low, high);
  22. quickSort(arr, low, pi - 1);
  23. quickSort(arr, pi + 1, high);
  24. }
  25. }
  26. void printArray(int arr[], int size) {
  27. for (int i = 0; i < size; i++) {
  28. printf("%d ", arr[i]);
  29. }
  30. printf("\n");
  31. }
  32. int main() {
  33. int arr[] = {10, 7, 8, 9, 1, 5};
  34. int n = sizeof(arr) / sizeof(arr[0]);
  35. quickSort(arr, 0, n - 1);
  36. printf("Sorted array: \n");
  37. printArray(arr, n);
  38. return 0;
  39. }

2. 非递归实现

通过模拟栈来实现快速排序的非递归版本。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void swap(int *a, int *b) {
  4. int temp = *a;
  5. *a = *b;
  6. *b = temp;
  7. }
  8. int partition(int arr[], int low, int high) {
  9. int pivot = arr[high];
  10. int i = low - 1;
  11. for (int j = low; j <= high - 1; j++) {
  12. if (arr[j] <= pivot) {
  13. i++;
  14. swap(&arr[i], &arr[j]);
  15. }
  16. }
  17. swap(&arr[i + 1], &arr[high]);
  18. return i + 1;
  19. }
  20. void quickSortIterative(int arr[], int l, int h) {
  21. int *stack = (int *)malloc(sizeof(int) * (h - l + 1));
  22. int top = -1;
  23. stack[++top] = l;
  24. stack[++top] = h;
  25. while (top >= 0) {
  26. h = stack[top--];
  27. l = stack[top--];
  28. int p = partition(arr, l, h);
  29. if (p - 1 > l) {
  30. stack[++top] = l;
  31. stack[++top] = p - 1;
  32. }
  33. if (p + 1 < h) {
  34. stack[++top] = p + 1;
  35. stack[++top] = h;
  36. }
  37. }
  38. free(stack);
  39. }
  40. void printArray(int arr[], int size) {
  41. for (int i = 0; i < size; i++) {
  42. printf("%d ", arr[i]);
  43. }
  44. printf("\n");
  45. }
  46. int main() {
  47. int arr[] = {10, 7, 8, 9, 1, 5};
  48. int n = sizeof(arr) / sizeof(arr[0]);
  49. quickSortIterative(arr, 0, n - 1);
  50. printf("Sorted array: \n");
  51. printArray(arr, n);
  52. return 0;
  53. }

3. 三路快速排序

该版本利用了三路划分来处理重复元素。

  1. #include <stdio.h>
  2. void swap(int *a, int *b) {
  3. int temp = *a;
  4. *a = *b;
  5. *b = temp;
  6. }
  7. void quickSort3Way(int arr[], int l, int h) {
  8. if (l >= h) return;
  9. int lt = l, gt = h;
  10. int pivot = arr[l];
  11. int i = l + 1;
  12. while (i <= gt) {
  13. if (arr[i] < pivot) {
  14. swap(&arr[i], &arr[lt]);
  15. lt++;
  16. i++;
  17. }
  18. else if (arr[i] > pivot) {
  19. swap(&arr[i], &arr[gt]);
  20. gt--;
  21. }
  22. else {
  23. i++;
  24. }
  25. }
  26. quickSort3Way(arr, l, lt - 1);
  27. quickSort3Way(arr, gt + 1, h);
  28. }
  29. void printArray(int arr[], int size) {
  30. for (int i = 0; i < size; i++) {
  31. printf("%d ", arr[i]);
  32. }
  33. printf("\n");
  34. }
  35. int main() {
  36. int arr[] = {4, 9, 4, 8, 4, 6, 4};
  37. int n = sizeof(arr) / sizeof(arr[0]);
  38. quickSort3Way(arr, 0, n - 1);
  39. printf("Sorted array: \n");
  40. printArray(arr, n);
  41. return 0;
  42. }

这些实现展示了快速排序的不同变体,各有所长。标准递归实现简单明了,但可能导致栈溢出;非递归实现通过使用栈避免了递归调用;三路快速排序更好地处理数组中包含大量重复元素的情况。选择使用时根据具体需求来决定。

    遇到难题? "AI大模型GPT4.0、GPT" 是你的私人解答专家! 点击按钮去提问......
无名城市 关注 已关注

最近一次登录:2024-11-20 23:16:48   

暂时还没有签名,请关注我或评论我的文章
×
免费图表工具,画流程图、架构图