C#排序算法的比较分析

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

复制代码 void ShellInsert(SqList &L, int dk) {
  // 对顺序表L作一趟希尔插入排序。本算法对算法10.1作了以下修改:
  //     1. 前后记录位置的增量是dk,而不是1;
  //     2. r[0]只是暂存单元,不是哨兵。当j<=0时,插入位置已找到。
  int i,j;
  for (i=dk+1; i<=L.length; ++i)
    if (LT(L.r[i].key, L.r[i-dk].key)) { // 需将L.r[i]插入有序增量子表
      L.r[0] = L.r[i];                   // 暂存在L.r[0]
      for (j=i-dk; j>0 && LT(L.r[0].key, L.r[j].key); j-=dk)
        L.r[j+dk] = L.r[j];              // 记录后移,查找插入位置
      L.r[j+dk] = L.r[0];                // 插入
    }
} // ShellInsert  
  
void ShellSort(SqList &L, int dlta[], int t) {
   // 按增量序列dlta[0..t-1]对顺序表L作希尔排序。
   for (int k=0;k<t;k++)
      ShellInsert(L, dlta[k]);  // 一趟增量为dlta[k]的插入排序
} // ShellSort

 

冒泡排序

时间复杂度:平均情况—O(n2) 最坏情况—O(n2) 辅助空间:O(1) 稳定性:稳定
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

复制代码 void BubbleSort(SeqList R) {
  int i,j;
  Boolean exchange; //交换标志
  for(i=1;i<n;i++){ exchange="FALSE;" j="n-1;j">=i;j--) //对当前无序区R[i..n]自下向上扫描
            if(R[j+1].key< R[j].key){//交换记录
                R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元
                R[j+1]=R[j];
                R[j]=R[0];