排序 (1) -----直接插入排序與希爾排序之間的關聯
阿新 • • 發佈:2018-12-20
直接插入排序與希爾排序之間的關聯
資料結構
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;
}
}
}
}
答案是:通常 進階進階直接插入排序(希爾排序) 比直接插入排序更快