int main ()
创新互联专注于梁子湖企业网站建设,成都响应式网站建设公司,电子商务商城网站建设。梁子湖网站建设公司,为梁子湖等地区提供建站服务。全流程定制网站制作,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务
{
int i;
DataType a[MaxSize];
SqList L;
srand((unsigned)time(NULL));
for (i=0;iMaxSize;i++)
{
int number = rand()%MaxSize + 1;
//printf ("%d ",number);
a[i].key = number;
L.data[i].key = a[i].key;
}
return 0;
}
#include stdio.h
#include "4-1 CreateData.c" //生成随机数的函数
#define ARRAYLEN 10 //需要排序的数据元素数量
void InserSort(int a[],int n)//直接插入排序
{
int i,j,t;
for(i=1;in;i++)
{
t=a[i]; //取出一个未排序的数据
for(j=i-1;j=0 ta[j];--j) //在排序序列中查找位置
a[j+1]=a[j]; //向后移动数据
a[j+1]=t; //插入数据到序列
}
}
int main()
{
int i,a[ARRAYLEN]; //定义数组
for(i=0;iARRAYLEN;i++) //清空数组
a[i]=0;
if(!CreateData(a,ARRAYLEN,1,100)) //判断生成随机数是否成功
{
printf("生成随机数不成功!\n");
getch();
return 1;
}
printf("原数据:"); //输出生成的随机数
for(i=0;iARRAYLEN;i++)
printf("%d ",a[i]);
printf("\n");
InserSort(a,ARRAYLEN); //调用插入排序函数
printf("排序后:");
for(i=0;iARRAYLEN;i++) //输出排序后的结果
printf("%d ",a[i]);
printf("\n");
getch();
return 0;
}
主要是看懂这个函数 void InserSort(int a[],int n)
for(i=1;i4;i++)
//外层
{
t=a[i];
for(
j=i-1
;
j=0
ta[j]
;
j--
)
//内层
a[j+1]=a[j];
a[j+1]=t;
}
你要理解插入排序的原理,外层for从第二个数开始遍历(i从1开始),用t(即对应的a[i])和其前面的所有值进行比较,如果t大,则该数后移一位,直到t小或者j小于0的时候退出内层for循环,这时候出现的格局就是所有在i位置之前比a[i]小的值全部后移了一位,退出循环时就会空出一个位置来。举个例子:输入:1
3
2
4
第一次循环时,t=a[1]=3,ta[0],所以a[0]后移一位(即:a[j+1]=a[j]
-
a[1]=a[0]),之后出现结果:1124,这时候实际上0位置是给此时的t预留的位置,内层for执行完毕后,执行:a[j+1]=t
正好弥补这个空缺。结果:3124
第二次循环时,j=1,t=a[2]=2,ta[1],所以a[1]后移一位:a[2]=a[1],之后结果:3114,在比较t和a[0],t小,跳出内层for,跳出时j为0,执行:a[1]=t=2,结果:3214
下面就不讲了,从上面可以看出,你说的那一句,至关重要,外层for每循环一次就插入一位数据,而a[j+1]=t,就是完成插入的最后一步。。
真是搞不懂你们脑洞,一个插入排序还分成一堆函数写。。。
#includecstdio
int a[20];
void InputArraay(){
for(int i = 1; i = 10; i++)scanf("%d",a[i]);
}
void OutputArraay(){
for(int i = 1; i = 10; i++)printf("%d ",a[i]);
}
//插入排序
//1.数据分为两部分,一开始有序部分包含1个元素
//2.依次将无序部分的元素插入到有序部分当中
void Insert(int i){
int j = i-1, k = a[i]; //j为当前下标, k为无序部分第一个元素
while(j=1 ka[j]){ //找到k元素在有序部分的位置
a[j+1] = a[j]; //循环的时候直接右移有序数组,为k腾出位置
j--; //不是k正确的位置,继续往前循环
}
a[j+1] = k; //出来的时候j多减了1,要加回去
}
void Sort(){
//遍历无序部分,每次取出第一个元素
for(int i = 2; i = 10; i++){
Insert(i);
}
}
int main(){
InputArraay();
Sort();
OutputArraay();
return 0;
}
通过C语言实现插入排序算法:对于少量排序的元素,插入排序是一个有效的算法,其操作过程类似于手中的扑克牌,从第二个元素从左往右循环检查比较,满足A[i]A[i-1],则交换A[i]与A[i-1]的值。往复循环直到最后一个元素比较完成。具体程序如下:
#include stdio.h
#includeconio.h
/*----------
*INSERT_SORT
*
* args
* A[] int[],the number of A arrary
* len int ,A length
*
------------*/
void insert_sort(int A[],int len){
int i,j,key;
//printf("A length %d\n",len); //output arrary length
for(j=1;jlen;j++){
key=A[j];
i=j-1;
while (i-1A[i]key) { //i from 0 to 5,so i-1
A[i+1]=A[i];
i=i-1;
A[i+1]=key;
}
}
//output A arrary
for(i=0;ilen;i++)
printf("%d ",A[i]);
}
int main()
{
int A[10];
int i=0;
char c;
while(1){
scanf("%d",A[i]); //input unmbers
c=getchar();
if(c=='\n')
break;
i++;
}
//printf("%d %d %d %d %d %d %d %d\n",A[0],A[1],A[2],A[3],A[4],A[5],A[6],A[7]);
//use insert_sort
insert_sort(A,i+1); //A length is i+1
return 0;
}
/*---test------------
* input 5 2 4 6 1 3
*
* output 1 2 3 4 5 6
* ------------------*/
以上程序使用的是Qt Creator 工具,用C语言实现,经调试已经通过。
但依然有个问题:在main()函数中调用insert_sort(int A[])时,若单传数组参数A[],再在insert_sort(int A[])函数里面调用len=sizeof(A)/sizeof(int)计算数组实际输入长度,但是得不到实际输入的数组长度,所以只能采用实参的方式将具体数字通过len传到insert_sort(int A[],int len );在insert_sort(int A[])接收到A数组后直接计算A[]实际输入长度,有什么办法可以实现?
写个样例给你看看吧
#include stdio.h
int main()
{
int n, a[11], i, j, t, v;
//scanf("%d", n);
scanf("%d", a[0]);//输入第一个数
for (i = 1; i 9; ++i){//剩下的八个
scanf(",%d", a[i]);
}
n = 9;
for (i = 0; i n; ++i){//选择排序
t = i;
for (j = i + 1; j n; ++j){
if (a[t] a[j])t = j;
}
if (t != i){
v = a[t], a[t] = a[i], a[i] = v;
}
}
scanf("%d", v);//要插入的数
for (i = n-1; i = 0; --i){
if (a[i] v){
a[i + 1] = a[i];
}
else break;
}
++i;//插入位置
a[i] = v;
n++;
for (i = 0; i n; ++i){//输出
if (i == 0)printf("%d", a[i]);
else printf(",%d", a[i]);
}
printf("\n");
return 0;
}