1. c语言中插入排序的基本思想是什么
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
2. C语言插入排序问题
#include<stdio.h>
#include<stdlib.h>
int main()
{
long long n,i,t,*arr,len=0;
scanf("%lld",&n);
arr=(long long*)calloc(n,sizeof(long long));
for(;n>0;n--)
{
scanf("%lld",&arr[len++]);
if(len>1&&arr[len-1]<arr[len-2])
{
t=arr[len-1];
for(i=len-2;i>=0&&arr[i]>t;i--)
arr[i+1]=arr[i];
arr[i+1]=t;
}
for(i=0;i<len-1;i++)
printf("%lld ",arr[i]);
printf("%lld\n",arr[len-1]);
}
free(arr);
return 0;
}
3. 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.说完了
4. 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次后排序完毕
5. 数组插入排序法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]也就是倒数第二个数时,内循环就执行一次,所有的数就能够比较完了,所以没必要再进行最后一个数了。
6. 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]);
}
7. 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;
}
}
8. C语言编程题--折半插入排序
又是数据结构的啊?
9. 数据结构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; //插入
}
上面是基本思想,更标准的代码,你可以网络查查。
10. C语言程序 插入排序法
#include<iostream>
using namespace std;
int main()
{
int s[23],c,d,p,i;
cout<<"输入从小到大二十个数"<<endl;
for(int i=0;i<20;i++)
{
cin>>c;
s[i]=c;
}
for(i=0;i<3;i++)
{
cin>>d;
for(p=0;p<20+i;p++)
if(d<s[p])
break;
for(int q=19+i;q>=p;q--)
{
s[q+1]=s[q];
}
s[p]=d;
for(int p=0;p<21+i;p++)
{
printf("%d,",s[p]);
if(p==20+i)
printf("\b \n");
}
}
cin>>c;
}