声明:
1、读者莫要看到大量的代码就晕头,其实核心的语句就那么几句,详细请看代码说明
2、关于希尔排序相关概念及文字描述,请百度百科
代码说明:
1、小编为了方便监测调试,直观理解,使用了大量简单的语句确定当前的交换数,看着冗余,读者可以自行修改
2、代码中晦涩的函数与句法并不多,所以小编没加注释,初学者完全可以边看边百度不懂的函数和句法,有益学习
3、代码中FArray[%d]=%d表示在交换前的操作数状态,同理LArray[%d]=%d表示交换后
4、代码中颜色函数过长,看着冗余,小编偷了懒,没优化,读者自行修改
5、两个输出函数作用不同
6、在调试结果中,深蓝绿色的数字为此次排序的操作数(限于进入本次i层循环与第一次j循环)
7、代码中跳出j层循环表示跳出或跳过j层循环
调试结果部分截图:
程序实现
//希尔排序.cpp:定义控制台应用程序的入口点。
//作者Hecker.ShingTao.Tan
#include"stdafx.h"
#include<stdlib.h>
#include<iostream>
#include<time.h>
#include<windows.h>
#defineMAX10
void Output(intArray[],intLength){
printf("\t\t");
for(inti = 0; i < Length; ++i){
printf("%d ",Array[i]);
}
printf("\n\n");
}
void Output1(intArray[],intLength,intvalue1,intvalue2){
printf("\t\t");
for(inti = 0; i < Length; ++i){
if(Array[i]==value1){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE|FOREGROUND_GREEN);
printf("%d ",Array[i]);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
}
elseif(Array[i]==value2){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE|FOREGROUND_GREEN);
printf("%d ",Array[i]);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
}
else{
printf("%d ",Array[i]);
}
}
printf("\n\n");
}
void Ran_Array(intArray[],intLength){
srand((unsigned)time(NULL));
for(inti = 0; i < Length; ++i){
Array[i]= rand() % 100;
if(i>=1 &&Array[i] ==Array[i- 1]){
Array[i]= rand() % 100;
}
}
}
void ShellSort(intArray[],intLength){
intstep;
inttemp1,temp2;
intj, i;
for(step =Length / 2; step > 0; step /= 2)//用来控制步长,最后递减到1
{
printf("--------------\n进入最外层循环\n--------------\n");
//i从第step开始排列,应为插入排序的第一个元素
//可以先不动,从第二个开始排序
for(i = step; i <Length; ++i)
{
printf("--------------\n进入i层循环\n--------------\n");
temp1= Array[i];
temp2= Array[i - step];
printf("i FArray[%d]=%d \n", i,Array[i]);
for(j = i - step; j >= 0 && temp1 <Array[j];j -= step)
{
printf("--------------\n进入j层循环\n--------------\n");
printf("j FArray[%d]=%d \n", j,Array[j]);
printf("j FArray[%d]=%d \n", j + step,Array[j+ step]);
Array[j+ step] =Array[j];
printf("j LArray[%d]=%d \n", j,Array[j]);
printf("j LArray[%d]=%d \n", j + step,Array[j+ step]);
temp2= Array[j];
Output(Array,Length);
}
printf("--------------\n跳出j层循环\n--------------\n");
printf("i LArray[%d]=%d \n", i,Array[i]);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE|FOREGROUND_GREEN);//颜色函数
printf("本次的交换工作在这里完成!\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_RED |FOREGROUND_BLUE);
Array[j+ step] = temp1;//将第一个位置填上
printf("i LArray[%d]=%d \n", j + step,Array[j+ step]);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
Output1(Array,Length,temp1, temp2);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_RED |FOREGROUND_BLUE);
}
printf("--------------\n跳出j层循环\n--------------\n");
}
printf("--------------\n跳出最外层循环\n--------------\n");
}
int main(){
intArray[MAX];
intLength =sizeof(Array) /sizeof(int);
Ran_Array(Array,Length);
printf("排序前:\n");
Output(Array,Length);
ShellSort(Array,Length);
printf("排序完成\n");
printf("排序后:\n");
Output(Array,Length);
system("pause");
return0;
}