当前位置:   article > 正文

【数据结构-C语言】快速排序,希尔排序_快速排序和希尔排序

快速排序和希尔排序

1、快速排序

快排是一种递归思想的排序算法,先比较其他的排序算法,它需要更多内存空间,但快排的语句频度是最低的,理论上时间效率是最高的。

快速排序的基本思路是:在待排序序列中随便选取一个数据,作为所谓“支点”,然后所有其他的数据与之比较,以从小到大排序为例,那么比支点小的统统放在其左边,比支点大的统统放在其右边,全部比完之后,支点将位与两个序列的中间,这叫做一次划分(partition)。

一次划分之后,序列内部也许是无序的,但是序列与支点三者之间,形成了一种基本的有序状态,接下去使用相同的思路,递归地对左右两边的子序列进行排序,直到子序列的长度小于等于1为止。

2、快速排序核心思想

while循环进行初次排序,第一个元素为0,第二个元素为len-1;嵌套两次while判断,根据自身需要的排序顺序,一次从右往左边比较(i++),一次从左向右比较(j--),逆序交换;返回中间的下标pivot;

使用递归思路

  1. //从第一个元素到中间元素再次排序,数组长度为pivot
  2. quickSort(data, pivot);
  3. //从pivot下一个元素到最后一个元素,数组长度为len - pivot - 1
  4. quickSort(data + pivot + 1, len - pivot - 1);

3、快速排序实现代码

  1. void swap(int* a, int* b)
  2. {
  3. int tmp;
  4. tmp = *a;
  5. *a = *b;
  6. *b = tmp;
  7. }
  8. int partition(int *data, int len)
  9. {
  10. if (len <= 1)
  11. return 0;
  12. int i = 0;
  13. int j = len - 1;
  14. while (i < j)
  15. {
  16. // 从右向左比较,顺序j--,逆序交换
  17. while (data[i] <= data[j] && i < j)
  18. {
  19. j--;
  20. }
  21. swap(&data[i], &data[j]);
  22. // 从左向右比较,顺序i++,逆序交换
  23. while (data[i] <= data[j] && i < j)
  24. {
  25. i++;
  26. }
  27. swap(&data[i], &data[j]);
  28. }
  29. return i;
  30. }
  31. void quickSort(int *data, int len)
  32. {
  33. if (len <= 1)
  34. return;
  35. int pivot = partition(data, len);
  36. quickSort(data, pivot);
  37. quickSort(data + pivot + 1, len - pivot - 1);
  38. }

4、希尔排序

希尔排序是一种改进版的插入排序,普通的插入排序算法中,是从第2个节点开始,依次插入到有序序列中,这种做法虽然“一次成形”,但研究发现时间效率上这么做并不划算,更“划算”的做法是这样的:

不严格一个个插入使之有序,而是拉开插入节点的距离,让它们逐步有序

5、希尔排序核心思想

选择排序的进阶排序算法

每次循环的间距为数组的一半,求出节点个数,间距为delta

第一次循环从delta开始遍历(遍历的第三个条件i+=delta),建立临时嵌套循环从i-delta开始(遍历的第三个条件为j-=delta),根据自身需要的顺序进行判断,满足则退出,不满足则进行交换

  1. // 起点 节点个数 间距
  2. insert_sort(data + i, len / delta, delta);

6、希尔排序实现代码

  1. void insert_sort(int data[], int len, int delta)
  2. {
  3. if (len <= 1)
  4. return;
  5. for (int i = delta; i < len * delta; i += delta)
  6. {
  7. int j, tmp = data[i];
  8. for (j = i - delta; j >= 0; j -= delta)
  9. {
  10. if (data[j] < tmp)
  11. break;
  12. data[j + delta] = data[j];
  13. }
  14. data[j + delta] = tmp; //退出循环的时候j减去了delta
  15. }
  16. }
  17. void shell_sort(int data[], int len)
  18. {
  19. if (len <= 1)
  20. return;
  21. for (int delta = len / 2; delta > 0; delta /= 2)
  22. {
  23. for (int i = 0; i < delta; ++i)
  24. {
  25. // 起点 节点个数 间距
  26. insert_sort(data + i, len / delta, delta);
  27. }
  28. }
  29. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/946510
推荐阅读
相关标签
  

闽ICP备14008679号