1. c語言的插入排序
第一個for循環i=2,執行的是這三個數20,46,33的排序,按程序執行下來:
{
temp=a[i]; //temp=33
j=i-1;
while(j>=0&&temp<a[j]) //因為j=1,所以最多循環兩次,具體還得看temp<a[j]的條件
{a[j+1]=a[j]; //第一次使得a[2]=46,第二次循環條件不成立,跳出循環
j--;
}
a[j+1]=temp; //a[1]=33
這樣就完成了前三個數的排序,下面i++後i=3執行前三個數排序,原理同上!
2. c語言插入排序問題
t=i;;
for(;i<9;i++);
這兩行多了 分號
呵呵
a[t]=num; 這個插入以後,應該退出循環,要加 break
見程序
一個重大的錯誤,嵌套的內外循環 用同一個變數,奇特!
怎麼能這樣?
3. 求直接插入排序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下編譯通過的,把靜態數組改成了動態數組,更加靈活。。。
4. 誰能給個c語言插入排序的代碼啊😄
#include<stdio.h>
#include<stdlib.h>
voidinsertSort(int*,int);
intmain()
{
inti,n;
intnum[10];
while(scanf("%d",&n)!=EOF)
{
//接收無序數據
for(i=0;i<n;i++)
{
scanf("%d",num+i);
}
//快速排序
insertSort(num,n);
//列印輸出
for(i=0;i<n;i++)
{
printf("%d",num[i]);
}
printf(" ");
}
return0;
}
voidinsertSort(int*array,intlen)
{
inti,j,temp;
for(i=1;i<len;i++)
{
temp=array[i];
for(j=i-1;j>=0;j--)
{
if(array[j]>temp)
{
array[j+1]=array[j];
}else
{
break;
}
}
array[j+1]=temp;
}
}
5. 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;
}
}
6. 求c語言里插入排序法的程序
#include <stdio.h>
int main ()
{
int n[10];
int i, j, k;
int temp;
for (i = 0; i <= 9; i++)
{
printf ("請輸入第%d個數:", i + 1);
scanf ("%d", &n[i]);
}
printf ("數組排序前效果如下\n");
for (i = 0; i <= 9; i++)
{
printf ("%d ", n[i]);
}
printf ("\n");
for (i = 1; i <= 9; i++)
{
for (j = i - 1; j >= 0; j--)
{
if (n[j] < n[i])
break;
}
if (j != i - 1)
{
temp = n[i];
for (k = i; k >= j + 1; k--)
n[k] = n[k - 1];
n[j + 1] = temp;
}
}
printf ("數組排序後效果如下\n");
for (i = 0; i <= 9; i++)
{
printf ("%d ", n[i]);
}
printf ("\n");
return 0;
}
7. 插入排序 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;
}
8. 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次後排序完畢
9. 怎樣用C語言程序實現插入法排序與起泡法演算法排序
直接插入排序的基本思想是:
當插入第i
(i≥
1)
個對象時,前面的V[0],
V[1],
…,
v[i-1]已經排好序。這時,用v[i]的關鍵碼與v[i-1],
v[i-2],
…的關鍵碼順序進行比較,找到插入位置即將v[i]插入,原來位置上的對象向後順移。
用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();
}
起泡排序:需反復比較相鄰兩個數的比較與交換這兩種基本操作。對相鄰的兩個數進行比較時,如果反面的數大於(或小於)前面的數,將這兩個數進行交換,大的數(小的數)往前冒。
void
Sort(a,n)
/*排序*/
{
float
a[];
int
n;
{
int
i;
int
flag;
float
t;
do{
flag=0;
for(i=0;i<=n-2;i++)
if(a[i+1]>a[i])
{
t=a[i];a[i]=a[i+1];a[i+1]=t;
flag=1;
}
}while(flag);
}