该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
是
/*希尔排序*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
#define MAX 11
void input(int num[])//产生10个随机数 1......10(MAX-1)
{
int i;
srand((unsigned)time(NULL));
for(i=1; i<MAX; i++)
num[i]=rand()%100; //产生100以内的随机数
}
void output(int num[])//打印
{
int i;
for(i=1; i<MAX; i++)
{
printf("%5d", num[i]);
if(0 == i%10)
printf("\n");
}
printf("\n");
}
//void shell_sort(int num[],int left,int right)//数组 1 10
//{
// int i,j,gap=right-left+1;
// int n=gap;
// do{
// gap=gap/3+1;
// for(i=0;i<gap;i++)//直接插入排序
// {
// for (j = i + gap; j <= n; j += gap)//第i个元素有序,从第i+gap个元素开始
// {
// if (num[j] < num[j - gap])
// {
// int temp = num[j];
// int k = j - gap;
// while (k >= 1 && num[k] > temp) //如果大于待排序元素,则后移一位
// {
// num[k + gap] = num[k];
// k -= gap;
// }
// num[k + gap] = temp;
// }
// }
//
// }
// }while(gap>1);
//}
void shell_sort(int num[],int left,int right)//数组 1 10
{
int i,j,gap=right-left+1;
int n=gap;
do{
gap=gap/3+1;
for (j = 1 + gap; j <= n; j++)直接插入排序:第i个元素有序,从第i+gap个元素开始
{
if (num[j] < num[j - gap])
{
int temp = num[j];
int k = j - gap;
//while (k >= 1 && num[k] > temp) //如果大于待排序元素,则后移一位
//{
// num[k + gap] = num[k];
// k -= gap;
//}
do{
num[k + gap] = num[k];
k -= gap;
}while (k >= 1 && num[k] > temp); //如果大于待排序元素,则后移一位
num[k + gap] = temp;
}
}
}while(gap>1);
}
void main()
{
int num[MAX];
input(num);
printf("sort before...\n");
output(num);
shell_sort(num,1,MAX-1);
printf("sort after...\n");
output(num);
}