您的位置:首页 > 运维架构 > Shell

直接插入排序 Shell(希尔)排序

2015-06-20 21:04 507 查看
直接插入排序

生成100~999之间的随机数的方法原来没见过,挺有趣的

插入的时候判断条件不要少写

/* 直接插入排序 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10

void CreatData(int a[],int n,int low ,int high);
void InsertSort(int a[],int n);

int main()
{
int i,data
;
CreatData(data,N,100,999);
printf("排序前:\n ");
for ( i = 0; i < N; ++i)
{
printf("%d ",data[i] );
}
printf("\n");

InsertSort(data,N);
printf("排序后: \n");
for ( i = 0; i < N; ++i)
{
printf("%d ",data[i] );
}
printf("\n");
return 0;

}

void CreatData(int a[],int n ,int low ,int high) //生成low~high之间的随机数并复制给数组a
{
int i,k;
double d;
srand(time(NULL));
for (i = 0; i < n; ++i)
{
d = (double)rand()/((double) RAND_MAX+1);
k = (int)(d*(high-low+1));
a[i] = k + low;
}
}

void InsertSort(int a[],int n)
{
int i,j,temp;
for (i = 1; i < n; i++) //从无序区头部开始,将其中每个每个元素插入到有序区
{
temp = a[i];
for(j = i-1 ; j >=0 && temp < a[j];j--) //在有序区查找应插入的位置
{
a[j+1] = a[j]; //后移一个位置
}
a[j+1] = temp; //插入
}
}


希尔排序
对直接插入排序进行改进   间隔的选择是希尔排序的重要部分

基本思想:

先将要排序的N 个数按间隔gap分成若干组,每组的元素的相差gap,对每组的全部元素进行直接插入排序,然后再用一个较小的间隔重复上述分组和排序,直至间隔为1.

/* 希尔排序 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10

void CreatData(int a[],int n,int low ,int high);
void ShellSort(int a[],int n);

int main()
{
int i,data
;
CreatData(data,N,100,999);
printf("排序前:\n ");
for ( i = 0; i < N; ++i)
{
printf("%d ",data[i] );
}
printf("\n");

ShellSort(data,N);
printf("排序后: \n");
for ( i = 0; i < N; ++i)
{
printf("%d ",data[i] );
}
printf("\n");
return 0;

}

void CreatData(int a[],int n ,int low ,int high) //生成low~high之间的随机数并复制给数组a
{
int i,k;
double d;
srand(time(NULL));
for (i = 0; i < n; ++i)
{
d = (double)rand()/((double) RAND_MAX+1);
k = (int)(d*(high-low+1));
a[i] = k + low;
}
}

void ShellSort(int a[],int n)
{
int gap,i,j,temp;

for(gap = n/2;gap > 0 ; gap/=2) //初始间隔为 n/2 ,以后每趟间隔缩小一半
{
for(i = gap ; i< n ;i++)
{
temp = a[i];
/* 对一组间隔为gap的元素进行插入排序*/
for(j = i-gap;j>=0&&a[j]>temp; j-=gap)
{
a[j+gap] = a[j];
}
a[j+gap] = temp; //插入
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: