直接插入排序
生成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[N];
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[N];
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; //插入
}
}
}