| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2727 人关注过本帖
标题:[讨论]关于插入排序法的实现
只看楼主 加入收藏
红影
Rank: 1
等 级:新手上路
威 望:2
帖 子:659
专家分:0
注 册:2006-2-22
结帖率:66.67%
收藏
 问题点数:0 回复次数:15 
[讨论]关于插入排序法的实现
插入排序法:
輸入一个個未排序的數字序列,輸出已排序的數字序列。
想法是一個一個插入已排序的序列,到正確的位置。
每次插入時,由後往前一個一個比較,直到正確位置。

我在网上找的插入排序法的例子不太能看懂:
#include "stdio.h"
  #include "conio.h"
  main()
  {
   int a[10],r[11];
   int *p;
   int i,j;
   for(i=0;i<10;i++)
{
p=&a[i];
printf("please scan the NO:
%d\n",i);
scanf("%d",p);
r[i+1]=a[i];
}
r[0]=1;
for(i=2;i<=10;i++)
{
r[0]=r[i];
j=i-1;
while(r[j]>r[0])
{
r[j+1]=r[j];
j--;
}
r[j+1]=r[0];
}
  for(i=1;i<=10;i++) {p=&r[i];printf("form min to max the NO: %d value=%d\n",i,*p);}
  getch();
 }

谁能给详细分析下这个排序法的用法???
搜索更多相关主题的帖子: 序列 include int 
2007-05-29 18:13
herbert_1987
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:1314
专家分:0
注 册:2007-5-13
收藏
得分:0 
#include "stdio.h"
  #include "conio.h"
  main()
  {
   int a[10],r[11]; /* a[10]用来输入,r[11]用来排序*/
   int *p;
   int i,j;

/*输入 a[10],并赋给 r[11];*/
   for(i=0;i<10;i++)
{
p=&a[i];
printf("please scan the NO:
%d\n",i);
scanf("%d",p);
r[i+1]=a[i];
}

r[0]=1;/* r[0] 是用来暂存待排序的数的*/

for(i=2;i<=10;i++)
{
r[0]=r[i];;/* 把待排序的数放到r[0]中 */

j=i-1;
while(r[j]>r[0])/ * r[0]与 i 前面的数比较( i 前面的数已经排好序了)*/
{
r[j+1]=r[j];
j--;
}
r[j+1]=r[0]; /* 插入r[0] */
}
/*输出排序结果*/
  for(i=1;i<=10;i++) {p=&r[i];printf("form min to max the NO: %d value=%d\n",i,*p);}
  getch();
 }

人生重要的不是所站的位置,而是所朝的方向
2007-05-29 19:13
红影
Rank: 1
等 级:新手上路
威 望:2
帖 子:659
专家分:0
注 册:2006-2-22
收藏
得分:0 
就是说定义2个数组a[]和r[],
假设一个是排序用的数组r[],一个是排序前的数组a[].
排序前的数组a[]用来存放输入的数,然后把这个排序前的数组a[]里的数依次放到排序用的那个数组r[]中,从r[1]开始存放。
再把r[]中从第二个数开始的每个数依次放到r[0]中,。。。。。。
j=i-1;
while(r[j]>r[0])/ * r[0]与 i 前面的数比较( i 前面的数已经排好序了)*/
{
r[j+1]=r[j];
j--;
}
r[j+1]=r[0]; /* 插入r[0] */
这段还是不太明白。。。。。。






生命中,不断有人离开和进入。于是,看见的,看不见了;记住的,遗忘了。
2007-05-29 21:10
红影
Rank: 1
等 级:新手上路
威 望:2
帖 子:659
专家分:0
注 册:2006-2-22
收藏
得分:0 
 #include "conio.h"
这个头文件是干嘛用的???

生命中,不断有人离开和进入。于是,看见的,看不见了;记住的,遗忘了。
2007-05-29 21:20
herbert_1987
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:1314
专家分:0
注 册:2007-5-13
收藏
得分:0 
调用getch()
用到 "conio.h"

人生重要的不是所站的位置,而是所朝的方向
2007-05-29 22:21
herbert_1987
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:1314
专家分:0
注 册:2007-5-13
收藏
得分:0 
回复:(红影)就是说定义2个数组a[]和r[],假设一个是...
这是 直接插入排序:
设当前待排序的数是数组中的第i个(1 ~ i-1 个数已经排好序了),
第i个数首先跟第 i-1 个数比较,
若 a[i] < a[i-1] ,则 a[i-1] 退到 a[i]处,
继续用a[i] 跟 a[i-2]比较,
若 a[i] < a[i-2] ,则 a[i-2] 退到 a[i-1]处,
继续用a[i] 跟 a[i-2]比较。。。。。
若a[i] > a[i-n] , 则结束。
若 a[i] > a[i-1], 则结束。

人生重要的不是所站的位置,而是所朝的方向
2007-05-29 22:35
红影
Rank: 1
等 级:新手上路
威 望:2
帖 子:659
专家分:0
注 册:2006-2-22
收藏
得分:0 
明白了一点
但是我写的这个调用函数怎么就是不对啊
void Sort(char *name[],int n)//插入排序法
{
int i,j;
char *s;
for(i=2;i<=n;i++)
{

s=name[i];
j=i-1;
while(name[j]>s)
{
name[j+1]=name[j];
j=j-1;
}
name[j+1]=s;
}
}

生命中,不断有人离开和进入。于是,看见的,看不见了;记住的,遗忘了。
2007-05-29 23:37
herbert_1987
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:1314
专家分:0
注 册:2007-5-13
收藏
得分:0 
改成这样看看:

void Sort(char *name[],int n)//插入排序法
{
int i,j;
char c;
char *str;
for(i=1;i < n;i++)
{

c=name[i][0];
str = name[i];
j=i-1;
while(j >= 0 && name[j][0] > c)
{
name[j+1]=name[j];
j=j-1;
}
name[j+1]=str;
}
}

人生重要的不是所站的位置,而是所朝的方向
2007-05-30 01:01
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
去数据结构版讨论啊,这个在数据结构中算是最简单的排序算法了
2007-05-30 01:08
红影
Rank: 1
等 级:新手上路
威 望:2
帖 子:659
专家分:0
注 册:2006-2-22
收藏
得分:0 
void Sort(char *name[],int n)//插入排序法
{
int i,j;
char *s;
char c;
for(i=1;i<n;i++)
{
c=name[i][0];
s=name[i];
j=i-1;
while(j >= 0 && name[j][0] > c)
{
name[j+1]=name[j];
j=j-1;
}
name[j+1]=s;
}
}

改了,运行结果不对。。。。。。



生命中,不断有人离开和进入。于是,看见的,看不见了;记住的,遗忘了。
2007-05-30 08:48
快速回复:[讨论]关于插入排序法的实现
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017913 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved