/*
* 希爾排序
*/
#include <iostream>
#include <iomanip>
using namespace std;
typedef int DataType;
#define Size 12
int* ShellGroup(int size); // 將數據分組
int GetShellGroupLength(const int* group); // 獲得分組數組的長度
void ShellTeamSort(DataType digit[], int* group, int len);//在各個小組內進行直接插入排序
void ShellSort(DataType digit[], int span);
void PaintShellSort(DataType digit[]);///輸出希爾排序序列
int main(void)
{
DataType digit[Size] = {
65, 34, 25, 87,
12, 38, 56, 46,
14, 77, 92, 23};
PaintShellSort(digit);
int* group = ShellGroup(Size);
int len = GetShellGroupLength(group);
ShellTeamSort(digit,group,len);
PaintShellSort(digit);
return 0;
}
//希爾排序
/***************************************/
//步驟一:分組
int* ShellGroup(int size)
{
int* Group; //就此程序,我定義了一個比較大的數組
Group = new int[5];
int count = 0; //
while(size >= 1)
{
Group[count] = size/2;
size /= 2;
count++;
}
return Group; //這裏的最後一個元素是 0;設置這個0我是爲了方便獲取數組的長度
}
int GetShellGroupLength(const int* group)
{
int size = 0;
int i = 0;
/*while(group[i] != 0) i++,size++;*/
for(i; group[i] != 0; i++,size++);
return size;
}
//步驟二:各個小組進行直接插入排序
void ShellTeamSort(DataType digit[], int* group, int len)
{
int span; //本次的增量
for(int i = 0; i < len; i++)
{
span = group[i];
ShellSort(digit,span);
}
}
void ShellSort(DataType digit[], int span)
{
DataType temp;
int j;
int k;
for(k = span; k < Size; k += span)
{
temp = digit[k];
j = k;
while(j > 0 && temp < digit[j-span])
{
digit[j] = digit[j-span];
j -= span;
}
digit[j] = temp;
}
}
/***************************************/
void PaintShellSort(DataType digit[])
{
for(int i = 0; i < Size; i++)
cout<<digit[i]<<setw(3);
cout<<endl;
}
希爾排序
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.