當前位置:首頁 » 編程語言 » c語言數組直接插敘排序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言數組直接插敘排序

發布時間: 2022-08-24 05:53:42

c語言數據結構直接插入排序法

你最後的那個printf中少寫了個%d,你仔細看看,你就輸出了3個變數。
而且,你的數據是從數組的第二個元素(下標1)開始存放的,那你在計算排名的時候,怎麼是讓i=1,再讓i與i-1比較呢,應該是i與i+1比較才對啊。
#include <stdio.h>
#define Maxsize 100

typedef struct student
{
char num[12];
char name[8];
int score;
int rank; //名次

}Elemtype;

typedef struct sqlist
{
Elemtype data[Maxsize];
int length;
}list;

void main()
{
list s;
int i,j;
printf("請輸入人數:");
scanf("%d",&s.length);
//---------------------
for(i=1;i<=s.length;i++)
{
printf("請輸入第%d個學生的學號:", i);
scanf("%s",s.data[i].num);
printf("請輸入第%d個學生的姓名:", i);
scanf("%s",s.data[i].name);
printf("請輸入第%d個學生的分數:", i);
scanf("%d",&s.data[i].score);
}
//-----------------------------------
printf("學號\t姓名\t分數\t\n");

for(i=1;i<=s.length;i++)
{
printf("%s\t%s\t%d\t\n",s.data[i].num,s.data[i].name,s.data[i].score);
}
//---------------開始排序了--------------
for(i=2;i<=s.length;i++)
{
s.data[0]=s.data[i];
for(j=i-1;s.data[0].score>s.data[j].score;j--)
{
s.data[j+1]=s.data[j];
}
s.data[j+1]=s.data[0];
}
//-------------輸出排序後的結果--------------
printf("----------------------------\n");
printf("學號\t姓名\t分數\t\n");
for(i=1;i<=s.length;i++)
{
printf("%s\t%s\t%d\t\n",s.data[i].num,s.data[i].name,s.data[i].score);
}
s.data[1].rank=1;
for(i=2;i<=s.length;i++)
{
if(s.data[i].score==s.data[i+1].score)
s.data[i+1].rank=s.data[i].rank;
else
s.data[i].rank=i;
}
printf("-------排名後----------\n");
printf("學號\t姓名\t分數\t名次\t\n");
for(i=1;i<=s.length;i++)
{
printf("%s\t%s\t%d\t%d\n",s.data[i].num,s.data[i].name,s.data[i].score,s.data[i].rank);
}

}
這是該國的,可正確運行。

㈡ 數組插入排序法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]也就是倒數第二個數時,內循環就執行一次,所有的數就能夠比較完了,所以沒必要再進行最後一個數了。

㈢ 數據結構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; //插入

}

上面是基本思想,更標準的代碼,你可以網路查查。

㈣ 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語言插入排序法,哪位高人舉個例子,直接插入的那種

你手裡有一張牌,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.說完了

㈥ 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語言直接插入排序~~!!!!

#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下編譯通過的,把靜態數組改成了動態數組,更加靈活。。。
樓主給分吧。。

edit:
剛看了樓上兩位的代碼,發現都沒有符合樓主的要求阿。。第一位少了一個insert函數,第二位insert函數少了一個任意int參數,不能對外來數據排序,從而不具有通用性。。。

㈧ 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]);
}