希尔排序

/*
 * 希尔排序
*/
#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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章