0


3秒的你对战“它”有没有胜算——quicksort

1.快排思路

2.分块实现

3.代码实现

1.快排思路

快速排序的基本思路就是选择一个基数.(我们这个基数的选择都是每一组最左边的数)

然后排成:

**1.**基数左边都是不大于它的,左边都是不小于它的

**2.**然后左边、右边继续进行这个基本思路

以完成排序作为最后的结束

2.分块实现

以6个数为一个例子吧!

4,2 ,6,3,1,5

第一步:确定一个基数,以每次排序最左边的数为基数。本次是4。

第二步:左边(用i表示)从第二个数开始与基数进行比较(遇见比基数大的停止比较),右边(用j表示)从最右边开始与基数进行比较(遇见比基数小的停止比较)

第三步:i,j停止时,它们所对应的值进行交换,直到i,j同时指向同一个值的时候,将这个值与基数进行交换。

接着进行循环这三个步骤,每一次基数的左边进行上面的操作,每一次基数的右边也进行上面的操作。直至排序完成。

3.代码实现

1.创建一个较大一点的数组(用于储存输入的数)和需要排序的个数

这里先创建全局变量,为了减少内存的利用

  1. #include <stdio.h>
  2. int arr[100], n;
  3. int main()
  4. {
  5. return 0;
  6. }

2.输入需要排序的个数和输入一组数

  1. int a;
  2. scanf("%d", &n);
  3. for (a = 0; a < n; a++)
  4. {
  5. scanf("%d", &arr[a]);
  6. }

3.排序(核心)(创建函数进行排序)

1)以最左边的值为基数,从最右边的数进行比较,遇到小于或者等于基数的值的时候停止,记下此时该数的下标。然后左边开始查找,遇到大于或者等于基数的值的时候停止,记下此时该数的下标。

  1. while (arr[j] >= arr[temp]&&i<j)
  2. {
  3. j--;
  4. }
  5. while (arr[i] <= arr[temp] && i < j)
  6. {
  7. i++;
  8. }

2)交换下标所对应的数,当左右下标对应同一个值时,将该值与基数交换(第一次排序完毕)

  1. while (i < j)
  2. {
  3. while (arr[j] >= arr[temp]&&i<j)
  4. {
  5. j--;
  6. }
  7. while (arr[i] <= arr[temp] && i < j)
  8. {
  9. i++;
  10. }
  11. t = arr[i];
  12. arr[i] = arr[j];
  13. arr[j] = t;
  14. }
  15. t = arr[left];
  16. arr[left] = arr[i];
  17. arr[i] = t;

3)用递归的方式不断的进行排序,基数左边,右边都需要用递归,递归结束的条件(左下标大于右下标)

  1. if (i > j)
  2. return 0;
  3. quicksort(left, i);//左
  4. quicksort(j+1, right);//右

该排序函数模块

  1. int quicksort(int left,int right)
  2. {
  3. int temp = left;
  4. int i = left;
  5. int j = right - 1;
  6. int t = 0;
  7. if (i > j)
  8. return 0;
  9. while (i < j)
  10. {
  11. while (arr[j] >= arr[temp]&&i<j)
  12. {
  13. j--;
  14. }
  15. while (arr[i] <= arr[temp] && i < j)
  16. {
  17. i++;
  18. }
  19. t = arr[i];
  20. arr[i] = arr[j];
  21. arr[j] = t;
  22. }
  23. t = arr[left];
  24. arr[left] = arr[i];
  25. arr[i] = t;
  26. quicksort(left, i);//左
  27. quicksort(j+1, right);//右
  28. return 0;
  29. }

4)打印出来拍好的序列

  1. for (a = 0; a < n; a++)
  2. {
  3. printf("%d ", arr[a]);
  4. }
  5. printf("\n");

听我讲了这么久,我们已经实现了快速排序

下面看完整的代码

  1. #include <stdio.h>
  2. int arr[100], n;
  3. int quicksort(int left,int right)
  4. {
  5. int temp = left;
  6. int i = left;
  7. int j = right - 1;
  8. int t = 0;
  9. if (i > j)
  10. return 0;
  11. while (i < j)
  12. {
  13. while (arr[j] >= arr[temp]&&i<j)
  14. {
  15. j--;
  16. }
  17. while (arr[i] <= arr[temp] && i < j)
  18. {
  19. i++;
  20. }
  21. t = arr[i];
  22. arr[i] = arr[j];
  23. arr[j] = t;
  24. }
  25. t = arr[left];
  26. arr[left] = arr[i];
  27. arr[i] = t;
  28. quicksort(left, i);//左
  29. quicksort(j+1, right);//右
  30. return 0;
  31. }
  32. int main()
  33. {
  34. int left, right;
  35. int a;
  36. scanf("%d", &n);
  37. for (a = 0; a < n; a++)
  38. {
  39. scanf("%d", &arr[a]);
  40. }
  41. left = 0;
  42. right = n;
  43. quicksort(left,right);
  44. for (a = 0; a < n; a++)
  45. {
  46. printf("%d ", arr[a]);
  47. }
  48. printf("\n");
  49. return 0;
  50. }

标签: 排序算法 算法

本文转载自: https://blog.csdn.net/m0_60598323/article/details/122225951
版权归原作者 INSTUDING 所有, 如有侵权,请联系我们删除。

“3秒的你对战&ldquo;它&rdquo;有没有胜算&mdash;&mdash;quicksort”的评论:

还没有评论