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;
}