Ⅰ c語言 完整的插入排序法
#include "stdio.h"
void main()
{
int m, i, j;
int a[11] = { 2, 6, 7, 9, 13, 16, 19, 21, 25, 29 }; /* 由於後面有插入1個元素的操作,故數組長度定為11(雖然數組中只有10個元素) */
scanf( "%d", &m );
for ( i = 0; i < 10; i++ )
if ( m < a[i] )
break;
{
for ( j = 9; j >= i; j-- )
a[j + 1] = a[j];
}
a[i] = m;
for ( i = 0; i < 11; i++ )
printf( "%d\t", a[i] );
}
Ⅱ 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語言插入法排序的演算法步驟
演算法描述
一般來說,插入排序都採用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語言插入排序法
你拿幾個數模擬一下就看到了。whille里的循環是負責每趟將最小的數排到它該在的位置,即第i趟循環是保證從0到i的元素單調增排列。temp是用來記錄當前i中的元素,有可能while執行一次a[i]處就有了新元素,值就改變了,然而temp還要繼續和前面的比較看看是不是仍要往前插入,這個循環一直是while在做
Ⅳ C語言插入排序法
用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語言
#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語言插入排序怎麼編
一般來說,插入排序都採用in-place在數組上實現。具體演算法描述如下: 1. 從第一個元素開始,該元素可以認為已經被排序 2. 取出下一個元素,在已經排序的元素序列中從後向前掃描 3. 如果該元素(已排序)大於新元素,將該元素移到下一位置 4. 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置 5. 將新元素插入到下一位置中 6. 重復步驟2 如果比較操作的代價比交換操作大的話,可以採用二分查找法來減少比較操作的數目。該演算法可以認為是插入排序的一個變種,稱為二分查找排序。
輸入參數中,需要排序的數組為array[],起始索引為first,終止索引為last。示例代碼的函數採用in-place排序,調用完成後,array[]中從first到last處於升序排列。
void insertion_sort(int array[], unsigned int first, unsigned int last)
{ int i,j;
int temp;
for (i = first+1; i<=last;i++)
{ temp = array[i]; j=i-1; //與已排序的數逐一比較, 大於temp時, 該數移後
while((j>=first) && (array[j] > temp))
{ array[j+1] = array[j];
j--;
}
array[j+1] = temp;
}
}
這個更好:
void InsertSort(char array[],unsigned int n)
{ int i,j;
int temp;
for(i=1;i<n;i++)
{
temp = array[i];//store the original sorted array in temp
for(j=i ; j>0 && temp < array[j-1] ; j--)//compare the new array with temp
{
array[j]=array[j-1];//all larger elements are moved one pot to the right
}
array[j]=temp;
}
}
Ⅷ 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)
如果需要對一個小型數組進行升序排列,那麼可以選用插入排序,插入排序可以用打牌時對摸起的牌根據牌的點數來對其進行插入排列來描述。
可以把左手中的牌比做已經摸起的牌,即已經被排列好的牌,左手可以容納的牌數的空間可以假想為和要摸的牌的總數相同;而在桌子上的那部分沒摸的牌則是未被排序的牌,這二者的關系可以抽象為數組中已經被排序好的部分和未被排序好的部分。
一開始摸起的第一張牌不需要排序,可以認定其為已排序的牌。
如果用外層循環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語言
外循環寫的不對,內循環也是錯了。首先外循環要從0開始,直到8就可以結束了。內循環從i +1開始,到9就可以結束了,所以外循環應該這樣寫:for (i=0;i<9;i++),內循環為:for (j=i+1;j<10;j++)。外循環從第一個數也就是a[0]開始,依次和後面的每一個數進行比較,所以內循環從i +1開始,直到最後一個數為止,這樣就能保證第一個數為最大的。然後再開始第二個數,以此類推。等到外循環到a [8]也就是倒數第二個數時,內循環就執行一次,所有的數就能夠比較完了,所以沒必要再進行最後一個數了。