直接插入排序c语言
Ⅰ 排序问题(c语言)
插入排序很简单的,一共n个数,每次去第i个,与前面的i-1个比较,这i-1是排好序的。while内循环的作用就是把第i个数与前面的i-1个比较,所以j--的意思就是倒过去找。
要理解R[j+1]=temp,就要看懂temp的作用,temp用来暂时保存当前需要插入的数,也就是第[i]个,这样把temp与前面每个数比较,直到找到不大于temp的,那么在找到正确位置前,每次把队伍向后排一位腾空一个位置,找到了的时候就是temp.key>=R[j].key,这时候j+1位置就是最终位置,把temp也就是目标数放进去。
上面我把temp当作一个数来说,省事,其实照你的程序看,它是一个record,记录类型,我学的语言多了点,不记得C里是不是这么叫的,所以RecType就是一个记录类型,C里面是不是叫struct?它有一些成员,比如.key,程序里比较的就是.key
Ⅱ C语言插入法排序的解释
直接插入排序的基本思想是:
当插入第i (i≥ 1) 个对象时,前面的V[0], V[1], …, v[i-1]已经排好序。这时,用v[i]的关键码与v[i-1], v[i-2], …的关键码顺序进行比较,找到插入位置即将v[i]插入,原来位置上的对象向后顺移。
算法分析:
1.若设待排序的对象个数为curremtsize = n,则该算法的主程序执行n-1趟。
2.关键码比较次数和对象移动次数与对象关键码的初始排列有关。
3.最好情况下,排序前对象已经按关键码大小从小到大有序,每趟只需与前面的有序对象序列的最后一个对象的关键码比较 1 次,移动 2 次对象,总的关键码比较次数为 n-1,对象移动次数为 2(n-1)。
用c实现的插入排序法,先输入10个数,然后利用插入排序法进行排序,将结果输出。
#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();
}
Ⅲ c语言如何把结构按其中的一个元素的大小用插入排序法排序
struct student { int id; // 编号 char name[NAME_LEN]; // 姓名 int gender; // '0'代表男性,'1'代表女性 Date birth; // 出生日期,格式 2010-11-23 double stature; // 身高,单位米 Study score; // 学习成绩 char ID[18]; // 身份证 };typedef struct student Student;
void swap(Student *s,int i,int j)
{
Student tmp=s[i];
s[i]=s[j];s[j]=tmp;
}
void Insert(Student *s,int i)
{
Student tmp=s[i];
while(i>=1&&s[i].id<s[i-1].id)
{swap(s,i,i-1);i--;}
s[i]=tmp;
}
InsertSort(Student *s,int len)
{
for(i=1;i<len;i++)
Insert(s,i);
}
int main()
{
Student s[10];
InsertSort(s,10);
return 0;
}
请看上述答案。我想应该是你要的结果。
Ⅳ c语言直接插入排序比较次数和移动次数
插入排序,冒泡排序,简单选择排序和堆排序它们在最坏的情况下各需的比较次序依次是:n平方 n平方 n平方 nlogn
Ⅳ 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语言中插入排序的基本思想是什么
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
Ⅶ c语言,用插入排序的方法将五个字符串从小到大排序
#include<stdio.h>
voidmain()
{
inta[]={0,-9,8,1,6};
inti,j,tem;
puts("Arraycontent:");
for(i=0;i<5;i++)
printf("%3d",a[i]);
putchar(10);
for(i=1;i<5;i++)
for(j=0;j<i;j++)
if(a[j]>a[i])
{
tem=a[j];
a[j]=a[i];
a[i]=tem;
}
puts("Sorted:");
for(i=0;i<5;i++)
printf("%3d",a[i]);
printf(" ");
}
Ⅷ C语言 插入排序 向n个有序的数中插入一个x
#include<stdio.h>
intmain()
{intt,n,i,j,x,a[200];
scanf("%d",&t);
for(i=0;i<t;i++)
{scanf("%d%d",&n,&x);
for(j=1;j<=n;j++)
scanf("%d",&a[j]);
a[0]=x;
j=n;
while(a[j]>x)
{a[j+1]=a[j];
j--;
}
a[j+1]=x;
for(i=1;i<=n;i++)
printf("%d",a[i]);
printf("%d ",a[i]);
}
return0;
}
Ⅸ C语言插入排序由小到大的代码
C语言插入排序由小到大的代码如下:
int main()
{
int a[10];
int i,j,temp=0;
int k,x=0;
printf("输入10个数: ");
for(i=0;i<10;i++)scanf("%d",&a[i]);
for(i=0;i<9;i++)
{
k = i;
for(j=i+1;j<10;j++)
if(a[j]<a[i])
k = j;
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
printf("排序后: ");
for(i=0;i<10;i++)
printf("%d ",a[i]);
getchar();getchar();
}
(9)直接插入排序c语言扩展阅读:
数学函数
所在函数库为math.h、stdio.h、string.h、float.h
int abs(int i) 返回整型参数i的绝对值
double cabs(struct complex znum) 返回复数znum的绝对值
double fabs(double x) 返回双精度参数x的绝对值
long labs(long n) 返回长整型参数n的绝对值
double exp(double x) 返回指数函数ex的值
doublefrexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中
doubleldexp(double value,int exp); 返回value*2exp的值
double log(double x) 返回logex的值
double log10(double x) 返回log10x的值
double pow(double x,double y) 返回x^y的值
doublepow10(int p) 返回10^p的值
double sqrt(double x) 返回+√x的值
Ⅹ 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;
}
}