zoukankan      html  css  js  c++  java
  • 高速排序

    针对冒泡排序我们进行一次优化,就引进了高速排序在此基础上进行优化

    基本思想:

    • 任取一个记录(如第一个)作为 枢轴或支点,设其keyword为pivotkey。

    • 在一趟排序后。全部比它小的记录一律前放,比它大的记录一律后放,形成左右两个子表,将枢轴放在分界处的位置;

    • 然后。分别对各子表又一次选择枢轴,并依此规则调整。直到每一个子表的元素仅仅剩一个。排序完毕。

    详细操作

    (1)附设两个指针low和high,初始时分别指向表的上限和下限。设枢轴记录的keyword为pivotkey(第一趟时,low=1。high=L.length)

    (2)从表的最右側位置。依次向左搜索找到第一个keyword小于pivotkey的记录和枢轴记录交换。

    详细操作:当

    low<high时。若high所指纪录的keyword大于等于pivotkey,则向左移动指针high(即–high)。否则high所指纪

    录与枢轴纪录交换。

    (3)然后再从表的左側位置。依次向右搜索第一个keyword大于pivotkey的记录和枢轴记录交换。详细操作:当low<high时,若low所指记录的keyword小等于pivotkey,则向右移动指针low(即++low),否则low所指记录与枢轴记录交换。

    (4)反复(2)(3)步骤,直到low和high相等为止,此时low或high的位置即为枢轴在此趟排序中的终于位置。原表被分成两个子表。

    这里写图片描写叙述
    这里写图片描写叙述

    • 每一趟的子表的形成是採用从两头向中间交替式逼近法;

    • 因为每趟中对各子表的操作都类似。可採用递归算法。

      int Partition(SqList &L,int low,int high)
      {
          L.r[0]=L.r[low];
          pivotkey=L.r[low].Key;
          while(low<high)
      {
           while(low<high&&L.r[high].Key>=pivotkey)--high;
           L.r[low]=L.r[high];
       while(low<high&&L.r[low].key<pivotkey)++low;
      }
       L.r[high]=L.r[low];
           return low;
      }
      void QSort(SqList &L,int low,int high)
      {
          if(low<high)
      {
          pivotloc=Partition(L,low,high);
          QSort(L,low,pivotloc-1);
          QSort(L,pivotloc+1,high);
      }
      }
          void QuickSort()
          {
          QSort(L,1,L.length);
      }
      

    算法分析能够证明,平均计算时间是O(nlog2n)。

    实验结果证明:就平均计算时间而言,高速排序是我们所学习的全部内排序方法中最好的一个。

    高速排序是递归的,须要有一个栈存放每层递归调用时參数(新的low和high)。

    最大递归调用层次数与递归树的深度一致。因此要求存储开销为O(log2n)。

    最好:划分后,左側右側子序列的长度同样

    最坏:从小到大排好序。递归树成单支树,每次划分仅仅得到一个比上一次少一个对象的子序列。必须经过n-1
    趟才干把全部对象定位,并且第i趟须要经过n-i次关键码比較才干找到第i个对象的安放位置

    时间效率:O(nlog2n)—-每趟确定的元素呈指数添加

    空间效率:O(log2n)—–递归要用到栈空间

    稳定性:不稳定—–可选任一元素为支点。

  • 相关阅读:
    如何用伪类画出一个三角形
    关于昨天遇到题目的一点随笔
    opacity与rgba
    选择框脚本_移动/重排选项 P435
    文字等宽
    CSS3风骚渐变
    表单序列化 P436
    选择框脚本_添加/删除选项 P434
    选择框脚本_用事件选中选项,获取选中项信息 P432
    文本框组脚本_自动切换焦点“例如加区号和分机号的电话号码文本框组” P426
  • 原文地址:https://www.cnblogs.com/lxjshuju/p/7170805.html
Copyright © 2011-2022 走看看