算法复习-交换类排序(2)-快速排序

快速排序

快速排序通过多次划分操作实现排序。
以升序为例,每趟选择当前所有子序列中的一个关键字(通常是第一个)作为枢纽,将子序列中比枢纽小的移到枢纽前面,比枢纽大的移到枢纽后面;当本趟所有子序列都被枢纽以上述规则划分后会得到新的一组更短的子序列,它们成为下一趟划分的初始序列集。

代码:

#include <iostream>
using namespace std;

void print_array(int array[], int n) {
  for (int i = 0; i < n; ++i)
    cout<<array[i]<<" ";
  cout<<endl;
}

void QuickSort_array(int array[], int low, int high) {
  int i, j, temp, compare;
  i = low;
  j = high;
  compare = array[i];

  if (low < high) {
    while (i < j) {
      while (j > i && array[j] >= compare)
        --j;
    
      if (i < j){
        array[i] = array[j];
        ++i;
      }

      while(i < j && array[i] < compare)
        ++i;

      if (i < j) {
        array[j] = array[i];
        --j;
      }
    }

    array[i] = compare;

    QuickSort_array(array, low, i - 1);
    QuickSort_array(array, i + 1, high);
  }
}

void QuickSort(int array[], int n) {
  QuickSort_array(array, 0, n - 1);
}

int main() {
  int array[] = {1, 5, 3, 6, 2, 9, 4};
  print_array(array, 7);
  QuickSort(array, 7);
  print_array(array, 7);
  
  return 0;
}

复杂度分析:

1. 时间复杂度:
快速排序最好情况下的时间复杂度为O(nlog2^n),待排序列越接近无序,本算法效率越高。 最坏情况下的时间复杂度为O(n2),待排序列越接近有序,本算法效率越低。平均情况下时间复杂度为O(nlog2^n)。快速排序的排序趟数和初始序列有关。
说明:还有多个时间复杂度为O(nlog2^n)的排序,但仅本算法叫做快速排序,因为这些算法的基本操作执行次数的多项式最高次项为XO(nlog2^n)(x为系数),快速排序的x最小,可见它在同级别的算法中是最好的,因此叫快速排序。*

2. 空间复杂度:
快速排序的空间复杂度是O(log2^n)。快速排序是递归进行的,递归需要栈的辅助,因此它需要的辅助空间比前面几类排序算法大。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 因为美好所以害怕 因为期待所以退步 我善于装出一副风平浪静的样子 不知道会这样错过 我早已习惯了隐藏 没有勇气随意...
    花少颜阅读 210评论 1赞 2
  • ——不忘初心,方得始终 忙里偷闲的一下午,听着窗外嘀嗒嘀嗒的雨声窝在被窝里捧着手机看完了《在不安的世界里安静的活着...
    七月秋讲故事阅读 1,180评论 0赞 0
  • 今天分享的书籍是弗兰克•伦茨的《说话的力量》。 说法的方式不同、语气语调不同,可能会出现截然不同的效果,好好说话对...
    面朝大海li阅读 178评论 0赞 4
  • 人们说 你是诗人 穿行在城市的水泥森林 把灰蒙蒙的调子 点染成五彩的花絮 人们惊讶于无穷的变幻 其实大美的世界 都...
    刘秀兰__深谷幽兰阅读 247评论 0赞 1

友情链接更多精彩内容