时间复杂度 最坏情况下O(快速排序 - 图1), 平均的复杂度为O(快速排序 - 图2)

快速排序也是一种分治的递归算法。将数组S排序的基本算法由下滤简单的四步组成:

  1. 如果S中元素的个数为0或者1,则返回;
  2. 取S中任意一元素快速排序 - 图3,称之为枢纽元(pivot)
  3. 快速排序 - 图4(S中剩余元素)分成两个不想交的集合: 和
  4. 返回quicksort(快速排序 - 图5)后,即随快速排序 - 图6 继而quicksort(快速排序 - 图7)

枢纽元的选择

  1. 随机选取枢纽元,利用随机数生成器,产生一个随机数充当枢纽元。
  2. 选取中值,
  1. void quickSort(int *arr, int size)
  2. {
  3. qSort(arr, 0, size - 1);
  4. };
  5. void qSort(int *arr, int start, int end)
  6. {
  7. if (start < end)
  8. {
  9. int q = partition(arr, start, end);
  10. qSort2(arr, start, q - 1);
  11. qSort2(arr, q + 1, end);
  12. }
  13. };
  14. int partition(int *arr, int start, int end)
  15. {
  16. int pivot = arr[start];
  17. int i = start;
  18. for (int j = start + 1; j <= end; j++)
  19. {
  20. if (arr[j] <= pivot)
  21. {
  22. i++;
  23. swap(&arr[i], &arr[j]);
  24. }
  25. }
  26. swap(&arr[start], &arr[i]);
  27. return i;
  28. };
  1. /**
  2. *
  3. * @param {number[]} arr
  4. */
  5. const quickSort = (arr) => {
  6. debugger
  7. _qs(arr, 0, arr.length - 1);
  8. }
  9. /**
  10. *
  11. * @param {number[]} arr
  12. * @param {number} left
  13. * @param {number} right
  14. */
  15. const _qs = (arr, left, right) => {
  16. if (left < right) {
  17. const idx = partition(arr, left, right);
  18. _qs(arr, left, idx - 1);
  19. _qs(arr, idx + 1, right);
  20. }
  21. }
  22. /**
  23. *
  24. * @param {number[]} arr
  25. * @param {number} left
  26. * @param {number} right
  27. * @returns {number}
  28. */
  29. const partition = (arr, left, right) => {
  30. let i = left;
  31. let j = right - 1;
  32. let mid = (left + right) >> 1
  33. let item = arr[mid];
  34. swap(arr, mid, right);
  35. while (i <= j) {
  36. while (i <= j && item > arr[i]) { i++ }
  37. while (i <= j && item < arr[j]) { j-- }
  38. if (i == j) break;
  39. if (i < j) {
  40. swap(arr, i, j)
  41. }
  42. }
  43. swap(arr, i, right);
  44. return i;
  45. }
  46. const swap = (arr, a, b) => {
  47. let t = arr[a];
  48. arr[a] = arr[b];
  49. arr[b] = t;
  50. }
  51. const arr = [50, 63, 41, 5, 9, 78, 30, 46, 84, 12, 1, 53, 63, 85, 9];
  52. // const arr = [6, 4, 2, 5, 9, 8, 3, 7]
  53. console.log(arr.join(" "));
  54. quickSort(arr);
  55. console.log(arr.join(" "));