当前位置:   article > 正文

排序算法之快排,希尔和冒泡_希尔排序和冒泡排序哪个快

希尔排序和冒泡排序哪个快

        排序算法有很多种,平常工作其实用到的不多,但是这几种的思想和实现需要了解。而且记起来也不容易混淆。

        快速排序的特点是,有两个索引去递增和递减,去跟基准比较。通过将基准小的排在前面,基准大的排在后面,递归完成。

  1. int sort(int *data, int left, int right){
  2. if(left >= right) return 0;
  3. int i = left;
  4. int j = right;
  5. int key = data[i];
  6. while(i < j){
  7. //每次大循环内可能同时有i++和j--,如果二层循环不加i < j,可能会导致i > j?(猜想),经测试,不加i < j,结果一样
  8. //while(i < j && key < data[j]){
  9. while(key < data[j]){//后面的值比基准值大就正常移动,一旦碰到比基准值小的就停下
  10. j--;//从后往前移动
  11. }
  12. data[i] = data[j];//将小于基准的值放到前面
  13. //while(i < j && key >= data[i]){
  14. while(key >= data[i]){//基准值比前面的值小就正常移动,一旦碰到比基准值大的就停下
  15. i++;//从前往后移动
  16. }
  17. data[j] = data[i];//将大于基准的值放在后面,j的位置是刚才从后往前移动时小于基准值的位置,已经被挪到前面
  18. }
  19. data[j] = key;//当i==j时,循环结束,此时的位置i==j即为基准值应该放置的位置。
  20. sort(data, left, i-1);//排列基准位置左边的序列
  21. sort(data, i+1, right);//排列基准位置右边的序列
  22. }

        希尔排序的核心思想是分组,然后组内排序。分组的方法类似于,搞团建的时候一个长队伍报数(长度为N),先是1到10(其实是N/2)报数,然后报同一个数字的一组(报1的一组,2的一组……),组内比较。再1到5报数,同样的方式再排序一遍。直到最后1到2报数,这是最后一次组内排序。从这个叙述来看,希尔排序又叫缩小增量排序就很好理解了。

  1. int shell_sort(int *data, int len){
  2. int gap = 0;//分组跨度
  3. int i = 0, j = 0;
  4. for(gap = len / 2; gap >= 1; gap /= 2){ //分组次数的循环
  5. for(i = gap; i < len; i++){
  6. int temp = data[i];
  7. for(j = i - gap; j >=0 && temp < data[j]; j = j - gap){
  8. data[j+gap] = data[j];
  9. }
  10. data[j+gap] = temp;
  11. }
  12. }
  13. return 0;
  14. }

        最后冒泡排序是最基础的一种,每次比较两个相邻的元素,如果前面的比后面的大,就交换。这里不贴实现,主要是用来做时间复杂度的对比。

排序方法时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)
冒泡排序O(n2)O(n2)O(n)
希尔排序O(n1.3)O(n2)O(n)
快速排序O(nlog2n)O(n2)O(nlog2n)
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/786943
推荐阅读
相关标签
  

闽ICP备14008679号