希爾排序

/*
 * 希爾排序
*/
#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;
}

發佈了15 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章