1. 程式人生 > >排序 (1) -----直接插入排序與希爾排序之間的關聯

排序 (1) -----直接插入排序與希爾排序之間的關聯

直接插入排序與希爾排序之間的關聯


資料結構

typedef int KeyType;
typedef int DataType;
struct Rectype
{
 KeyType Key;
 DataType Data;
};
void Swap(Rectype *arr, int a, int b)
{
 Rectype Temp;
 Temp = arr[a];
 arr[a] = arr[b];
 arr[b] = Temp;
}
 Rectype a[] = { 1,0,4,0,3,0,60,0,5,0,6,0,7,0,2,0,9,0,10,0 };//1 4 3 60 5 6 7 2 9 10

1.直接插入排序

void DirInsertSort(Rectype *R, int n)
{
 int i, j;
 for (i = 1; i < n; i++)
 {
  j = i;
  while (R[j - 1].Key < R[j].Key&&j-1>=0)
  {
   Swap(R, j - 1, j);
   j--;
  }
 }
}
輸出 60 10 9 7 6 5 4 3 2 1

2.進階直接插入排序

void DirInsertGapSort(Rectype *R, int n)
{
 int Gap =
3; int i, j; for (i = Gap; i < n; i++) { j = i; while (R[j - Gap].Key < R[j].Key&&j-Gap>=0) { Swap(R, j - Gap, j); j-=Gap; } } }
輸出 60 5 9 10 4 6 7 2 3 1
Gap為3的時候,將輸出結果解析就是  
第一組 9 6 3 
第二組 5 4 2 
第三組 60 10 7 1
這個設定Gap的方法將我們的資料分組排序

我們將Gap 設為 1的時候就成為了初級的直接插入排序
於是我們想,假如我們進行多次取不同的 Gap 進行直接插入排序,前面的排好隊會讓後面再排效率高一些嗎?


3.進階進階直接插入排序(希爾排序)

void ShellSort(Rectype *R, int n) 
{
 for (int gap = n / 2; gap > 0; gap /= 2)
 {
  for (int i = gap; i < n; i++) 
  {
   int j = i;
   while (R[j - gap].Key < R[j].Key&&j - gap >= 0) 
   {
    Swap(R, j - gap,j );
    j -= gap;
   }
  }
 }
}

答案是:通常 進階進階直接插入排序(希爾排序) 比直接插入排序更快