C#排序算法的比较分析

2019-12-26 12:02:09王冬梅

                exchange=TRUE; //发生了交换,故将交换标志置为真
            }
            if(!exchange) //本趟排序未发生交换,提前终止算法
            return;
  } //endfor(外循环)
}

 

快速排序

时间复杂度:平均情况—O(nlog2n) 最坏情况—O(n2) 辅助空间:O(log2n) 稳定性:不稳定
快速排序有两个方向,左边的i下标一直往右走,当a[i] <= a[center_index],其中center_index是中枢元素的数组下标,一般取为数组第0个元素。而右边的j下标一直往左走,当a[j] > a[center_index]。如果i和j都走不动了,i <= j, 交换a[i]和a[j],重复上面的过程,直到i>j。 交换a[j]和a[center_index],完成一趟快速排序。在中枢元素和a[j]交换的时候,很有可能把前面的元素的稳定性打乱,比如序列为 5 3 3 4 3 8 9 10 11, 现在中枢元素5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱,所以快速排序是一个不稳定的排序算法,不稳定发生在中枢元素和a[j]交换的时刻。

复制代码 int Partition(SqList &L, int low, int high) {
 // 交换顺序表L中子序列L.r[low..high]的记录,使枢轴记录到位,
   // 并返回其所在位置,此时,在它之前(后)的记录均不大(小)于它
   KeyType pivotkey;
   RedType temp;
   pivotkey = L.r[low].key;     // 用子表的第一个记录作枢轴记录
   while (low < high) {           // 从表的两端交替地向中间扫描
      while (low < high && L.r[high].key>=pivotkey) --high;
      temp=L.r[low];
      L.r[low]=L.r[high];
      L.r[high]=temp;           // 将比枢轴记录小的记录交换到低端
      while (low  < high && L.r[low].key < =pivotkey) ++low;
      temp=L.r[low];
      L.r[low]=L.r[high];
      L.r[high]=temp;           // 将比枢轴记录大的记录交换到高端
   }
   return low;                  // 返回枢轴所在位置