㈠ c语言数据结构直接插入排序法
你最后的那个printf中少写了个%d,你仔细看看,你就输出了3个变量。
而且,你的数据是从数组的第二个元素(下标1)开始存放的,那你在计算排名的时候,怎么是让i=1,再让i与i-1比较呢,应该是i与i+1比较才对啊。
#include <stdio.h>
#define Maxsize 100
typedef struct student
{
char num[12];
char name[8];
int score;
int rank; //名次
}Elemtype;
typedef struct sqlist
{
Elemtype data[Maxsize];
int length;
}list;
void main()
{
list s;
int i,j;
printf("请输入人数:");
scanf("%d",&s.length);
//---------------------
for(i=1;i<=s.length;i++)
{
printf("请输入第%d个学生的学号:", i);
scanf("%s",s.data[i].num);
printf("请输入第%d个学生的姓名:", i);
scanf("%s",s.data[i].name);
printf("请输入第%d个学生的分数:", i);
scanf("%d",&s.data[i].score);
}
//-----------------------------------
printf("学号\t姓名\t分数\t\n");
for(i=1;i<=s.length;i++)
{
printf("%s\t%s\t%d\t\n",s.data[i].num,s.data[i].name,s.data[i].score);
}
//---------------开始排序了--------------
for(i=2;i<=s.length;i++)
{
s.data[0]=s.data[i];
for(j=i-1;s.data[0].score>s.data[j].score;j--)
{
s.data[j+1]=s.data[j];
}
s.data[j+1]=s.data[0];
}
//-------------输出排序后的结果--------------
printf("----------------------------\n");
printf("学号\t姓名\t分数\t\n");
for(i=1;i<=s.length;i++)
{
printf("%s\t%s\t%d\t\n",s.data[i].num,s.data[i].name,s.data[i].score);
}
s.data[1].rank=1;
for(i=2;i<=s.length;i++)
{
if(s.data[i].score==s.data[i+1].score)
s.data[i+1].rank=s.data[i].rank;
else
s.data[i].rank=i;
}
printf("-------排名后----------\n");
printf("学号\t姓名\t分数\t名次\t\n");
for(i=1;i<=s.length;i++)
{
printf("%s\t%s\t%d\t%d\n",s.data[i].num,s.data[i].name,s.data[i].score,s.data[i].rank);
}
}
这是该国的,可正确运行。
㈡ 数组插入排序法c语言
外循环写的不对,内循环也是错了。首先外循环要从0开始,直到8就可以结束了。内循环从i +1开始,到9就可以结束了,所以外循环应该这样写:for (i=0;i<9;i++),内循环为:for (j=i+1;j<10;j++)。外循环从第一个数也就是a[0]开始,依次和后面的每一个数进行比较,所以内循环从i +1开始,直到最后一个数为止,这样就能保证第一个数为最大的。然后再开始第二个数,以此类推。等到外循环到a [8]也就是倒数第二个数时,内循环就执行一次,所有的数就能够比较完了,所以没必要再进行最后一个数了。
㈢ 数据结构c语言直接插入排序代码
插入排序就类似摸牌理牌的过程。每摸一个数,将其插入前面已排好的序列中。用数组实现即可。
下面我写出主要代码:
for(i=2;i<=N;i++) //这里我不用数组零空间,用来插的数据,插完第二个接着插第三个
{ //第一个数本来就有序,所以不用插了
key=a[i]; //把要插的数先保存起来,因为待会儿你插在前面时,元素要后移,会将其覆盖
for(j=i-1;j>0;j--) //你插第i个元素,说明前1到i-1个元素都排好了。
{
if(key>a[j]) //从有序序列中最后的元素比较,这里我用从小到大排序
{ //上面说明插入位置应该是第j+1个。
for(k=i-1;k>=j-1;k--) //后移操作。
a[k+1]=a[k];
}
a[j+1]=key; //插入
}
上面是基本思想,更标准的代码,你可以网络查查。
㈣ C语言编程插入法排序
算法描述
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到该位置后
重复步骤2~5
如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。
范例程式码
void insertion_sort(int array[], int first, int last)
{
int i,j;
int temp;
for (i = first+1; i<=last;i++)
{
temp = array[i];
j=i-1;
while((j>=first) && (array[j] > temp))
{
array[j+1] = array[j];
j--;
}
array[j+1] = temp;
}
}
㈤ c语言插入排序法,哪位高人举个例子,直接插入的那种
你手里有一张牌,A,接起一张Q,插入手中,你发现Q比A小,把它放在了A前面。又接起一张K,你先发现K比Q大,然后又发现K比A小,把K放在A前面。
这里有3个插入动作。我来解释一下
当插入第一个元素时,数组a[0]直接赋值A。因为不需要比
插入第二个时需要循环,从0到当前元素的个数··可写一个getsize()的函数 一个一个去比较。如果手中的牌key比元素大时,用continue跳过,如果key比元素a[i]小,则a[i]后面的所有元素向后移一位把key放在原来a[i]的地方。
ok如果你的数组是动态分配的,那么期间还需要使用realloc(size+1)的内存操作。插入成功后,size也要+1.说完了
㈥ C语言的插入排序法是什么
插入排序(insertion sort)
如果需要对一个小型数组进行升序排列,那么可以选用插入排序,插入排序可以用打牌时对摸起的牌根据牌的点数来对其进行插入排列来描述。
可以把左手中的牌比做已经摸起的牌,即已经被排列好的牌,左手可以容纳的牌数的空间可以假想为和要摸的牌的总数相同;而在桌子上的那部分没摸的牌则是未被排序的牌,这二者的关系可以抽象为数组中已经被排序好的部分和未被排序好的部分。
一开始摸起的第一张牌不需要排序,可以认定其为已排序的牌。
如果用外层循环for来表示摸起的牌的话,则可以抽象为:
// 对象数组
// 桌子上的牌
int A[] = {5,1,3,6,2,4};
// 从数组的第二个元素开始抽取
for(int i = 1; i < sizeof A/sizeof A[0]; ++i)
{
int pick = A[i]; // 被摸起的牌
int j = i - 1; // j记录已排序部分的最后一张牌的位置
. . .
}
而后摸起的排要根据排列策略和先前摸起的牌的点数的大小来确定其插入的合适位置,这里示范的排列策略是升序排列,摸起了这张牌后,便自右向左地和手中的牌进行比较。
把pick称作摸起的牌,如果pick比手中的牌小,则手中较大的那张牌就向右挪一位,pick再和下一张牌做比较,如果下一张牌仍然比pick大,那么那张牌便也向右移动一个位置,依此类推。
如果手中下一张和pick比较的牌比pick小,那么pick就被插入在了手中前一张牌移动后空下的位置;
或者手中所有的牌都比pick大,那么所有的牌就都向右移动过一个位置,所以pick最终被插入在了手中最左边的位置。
这个过程可以抽象为:
// 对象数组
// 桌子上的牌
int A[] = {5,1,3,6,2,4};
// 从数组的第二个元素开始抽取
for(int i = 1; i < sizeof A/sizeof A[0]; ++i)
{
int pick = A[i]; // 被摸起的牌
int j = i - 1; // j记录已排序部分的最后一张牌的位置
// 如果循环了j+1次,即j = -1时还未找到比pick小的牌
// 那么pick就是最小的牌被插入在位置A[0]处
// A[j]是当前手中和pick进行比较的牌
while(j >= 0 && A[j] > pick)
{
// 未找到可插入位置,则A[j]向后挪一位
A[j+1] = A[j];
// j减1继续向左定位手中下一张供和pick比较的牌--j;
}
// while结束后,j+1所表达的位置便是pick可以插入的位置
A[j+1] = pick;
}
// 对于有N个元素的数组A,采用插入排序法排序时,当外层循环进行了N-1次后排序完毕
㈦ 求助~!c语言直接插入排序~~!!!!
#include <stdio.h>
#include <stdlib.h>
void insert(int *arr, int a, int n){ /*0到n-1都已排好序*/
int i;
int key = a;
for(i=0; i<n; i++){
if(key < arr[i]){
int j;
for(j=n-1; j>=i; j--){
arr[j+1] = arr[j];
}
arr[i] = key;
return;
}
}
arr[n] = key;
return;
}
void sort(int *arr, int size){
if(size<2)
return;
int i;
for(i=1; i<size; i++){
insert(arr, arr[i], i);
}
}
void main(){
int i, n, *arr;
printf("请输入数组的大小 n = ");
scanf("%d", &n);
arr = (int*)malloc(sizeof(int)*n);
printf("请输入%d个数组元素:\n", n);
for(i=0; i<n; i++){
scanf("%d", &arr[i]);
}
printf("在排序前,数组为:");
for(i=0; i<n; i++){
printf("%d ", arr[i]);
}
printf("\n调用排序函数中...\n");
sort(arr, n);
printf("在排序后,数组变为:");
for(i=0; i<n; i++){
printf("%d ", arr[i]);
}
printf("\n");
free(arr);
}
===
刚刚写好,并在VC2010下编译通过的,把静态数组改成了动态数组,更加灵活。。。
楼主给分吧。。
edit:
刚看了楼上两位的代码,发现都没有符合楼主的要求阿。。第一位少了一个insert函数,第二位insert函数少了一个任意int参数,不能对外来数据排序,从而不具有通用性。。。
㈧ C语言直接插入排序
#include<stdio.h>
#define max 4
void insert(int a[],int count)//从小到大排序
{
int i,j;
for(i=2;i<=count;i++)
if(a[i]<a[i-1])
{
a[0]=a[i];
a[i]=a[i-1];
for(j=i-2;a[0]<a[j];j--)
a[j+1]=a[j];
a[j+1]=a[0];//仔细分析排序过程
}
}
void main()
{
int i;
/*数组的开始下标是0,最大的是max-1,比如arr[5]的数组,下标是0,1,2,3,4*/
int a[max+1];//修改这句就可以了
for(i=1;i<=max;i++)
scanf("%d",&a[i]);
insert(a,max);
for(i=1;i<=max;i++)
printf("%d ",a[i]);
}