當前位置:首頁 » 編程語言 » 頭歌C語言排序問題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

頭歌C語言排序問題

發布時間: 2022-09-14 07:39:18

c語言中的鏈表排序問題

link sort(link head) //head為表頭結點
{
link beforep,p,p1,k,beforek,temp;
if(head==NULL)printf("信息系統為空!!!按任意鍵回到主菜單!\n"); //表頭節點為空即鏈表為空
else
{p=head; //指針p指向表頭
while(p->next!=NULL) //當鏈表沒有遍歷完執行循環體
{
k=p; //指針k指向指針p
p1=p->next; //指針p1指向指針p的下一個節點
while(p1!=NULL) //當指針p1不為空,執行循環體
{
if(k->aver<p1->aver)k=p1; //這里的k->表示k所指向對象的aver成員
p1=p1->next; //當k指向的aver成員小於p1指向的aver成員,k指向p1
} //這個循環結束後,k將指向鏈表中p之後所有節點的aver成員最小的那個節點,這是插入排序的搜索過程
if(k!=p) //如果aver成員最小的節點不是p所指向的節點
{
beforek=head; //beforek從頭結點往後尋找
while(beforek->next!=k)beforek=beforek->next; //循環結束後,beforek指針將指向k指針的前一個節點,因為條件beforek->next==k 才結束循環
if(p==head)head=k; //如果p是頭結點,頭結點指向k(k是成員aver最小的,排在第一個節點作為頭結點)?
else beforep->next=k; //否則beforep->next指向k,(請注意這里的beforep與剛才的beforek不一樣)
beforek->next=p; //beforek->next指向指針p
temp=k->next;
k->next=p->next;
p->next=temp; //交換k->next和p->next指針
p=k; //p指向k
} //這個函數體運行結束後,p指針指向鏈表aver成員最小的那個節點,這也就是插入排序的交換過程
beforep=p; //指針回指
p=p->next; // 遍歷下一個節點
}
printf("排序成功,按任意鍵回到主菜單!\n");
}
return(head); //返回頭結點
}

如果還是看不懂,你就留Q追問我

Ⅱ c語言排列問題

下面是C語言裡面常用的三種排序方法,但願對樓主有幫助,一、冒泡法(起泡法)演算法要求:用起泡法對10個整數按升序排序。演算法分析:如果有n個數,則要進行n-1趟比較。在第1趟比較中要進行n-1次相鄰元素的兩兩比較,在第j趟比較中要進行n-j次兩兩比較。比較的順序從前往後,經過一趟比較後,將最值沉底(換到最後一個元素位置),最大值沉底為升序,最小值沉底為降序。演算法源代碼: # include main() { int a[10],i,j,t; printf("Please input 10 numbers: "); /*輸入源數據*/ for(i=0;i<10;i++) scanf("%d",&a[i]); /*排序*/ for(j=0;j<9;j++) /*外循環控制排序趟數,n個數排n-1趟*/ for(i=0;i*內循環每趟比較的次數,第j趟比較n-j次*/ if(a[i]>a[i+1]) /*相鄰元素比較,逆序則交換*/ { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } /*輸出排序結果*/ printf("The sorted numbers: "); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); } 演算法特點:相鄰元素兩兩比較,每趟將最值沉底即可確定一個數在結果的位置,確定元素位置的順序是從後往前,其餘元素可能作相對位置的調整。可以進行升序或降序排序。演算法分析:定義n-1次循環,每個數字比較n-j次,比較前一個數和後一個數的大小。然後交換順序。二、選擇法演算法要求:用選擇法對10個整數按降序排序。演算法分析:每趟選出一個最值和無序序列的第一個數交換,n個數共選n-1趟。第i趟假設i為最值下標,然後將最值和i+1至最後一個數比較,找出最值的下標,若最值下標不為初設值,則將最值元素和下標為i的元素交換。演算法源代碼: # include main() { int a[10],i,j,k,t,n=10; printf("Please input 10 numbers:"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=0;i main() { int a[10],i,j,t; printf("Please input 10 numbers: "); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=1;i*外循環控制趟數,n個數從第2個數開始到最後共進行n-1次插入*/ { t=a[i]; /*將待插入數暫存於變數t中*/ for( j=i-1 ; j>=0 && t>a[j] ; j-- ) /*在有序序列(下標0 ~ i-1)中尋找插入位置*/ a[j+1]=a[j]; /*若未找到插入位置,則當前元素後移一個位置*/ a[j+1]=t; /*找到插入位置,完成插入*/ } printf("The sorted numbers: "); for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); } 演算法特點:每趟從無序序列中取出第一個數插入到有序序列的合適位置,元素的最終位置在最後一趟插入後才能確定位置。也可是先用循環查找插入位置(可從前往後或從後往前),再將插入位置之後的元素(有序列中)逐個後移一個位置,最後完成插入。該演算法的特點是在尋找插入位置的同時完成元素的移動。因為元素的移動必須從後往前,則可將兩個操作結合在一起完成,提高演算法效率。仍可進行升序或降序排序。二、下面是三種排序的概念及其優缺點冒泡排序已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[2]與a[3]的值,若a[2]大於a[3]則交換兩者的值,否則不變。再比較a[3]與a[4],依此類推,最後比較a[n-1]與a[n]的值。這樣處理一輪後,a[n]的值一定是這組數據中最大的。再對a[1]~a[n-1]以相同方法處理一輪,則a[n-1]的值一定是a[1]~a[n-1]中最大的。再對a[1]~a[n-2]以相同方法處理一輪,依此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。優點:穩定,比較次數已知;缺點:慢,每次只能移動相鄰兩個數據,移動數據的次數多。選擇排序已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大於a[2]則交換兩者的值,否則不變。再比較a[1]與a[3]的值,若a[1]大於a[3]則交換兩者的值,否則不變。再比較a[1]與a[4],依此類推,最後比較a[1]與a[n]的值。這樣處理一輪後,a[1]的值一定是這組數據中最小的。再將a[2]與a[3]~a[n]以相同方法比較一輪,則a[2]的值一定是a[2]~a[n]中最小的。再將a[3]與a[4]~a[n]以相同方法比較一輪,依此類推。共處理n-1輪後a[1]、a[2]、……a[n]就以升序排列了。優點:穩定,比較次數與冒泡排序一樣,數據移動次數比冒泡排序少;缺點:相對之下還是慢。插入排序已知一組升序排列數據a[1]、a[2]、……a[n],一組無序數據b[1]、b[2]、……b[m],需將二者合並成一個升序數列。首先比較b[1]與a[1]的值,若b[1]大於a[1],則跳過,比較b[1]與a[2]的值,若b[1]仍然大於a[2],則繼續跳過,直到b[1]小於a數組中某一數據a[x],則將a[x]~a[n]分別向後移動一位,將b[1]插入到原來a[x]的位置這就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若無數組a,可將b[1]當作n=1的數組a)優點:穩定,快;缺點:比較次數不一定,比較次數越少,插入點後的數據移動越多,特別是當數據總量龐大的時候,但用鏈表可以解決這個問題。

Ⅲ C語言比較大小排序問題

#define N 10//宏定義,用N代替10
#include "stdio.h"//標准輸入輸出庫,你在控制台輸入數據和顯示數據用的
main()//主函數
{
int a[N],i,j,temp;//聲明需要排序的數組a和排序用的的一些「小工具」,i、j、temp
printf("請輸入%d個整數:\n",N);
for(i=0;i<N;i++)//這個循環是和用戶交互,手動輸入10個數理組成數組
scanf("%d",&a[i]);
for(i=0;i<N-1-i;i++)//i從前往後數
for(j=0;j<N-1-i;j++)//在每一個i(比如0,比如1)下從前往後數j
if(a[j]>a[j+1])//如果j比他後邊的大,交換
{temp=a[j];a[j]=a[j+1];a[j+1]=temp;}//兩數前後互換
//上邊這個循環就是從前往後數a的元素,比如到a[0],那麼最大的數移到最後一位;在比如a[1],倒數第二大的數移到倒數第二位(因為最大的在後邊,你移步過去了?)
//為什麼要走這么多次。每次j的循環都好比一個波浪,一次只能保證一個最大數到了最後一位,其他的可能還是亂序,所以要一浪接一浪。
//這個演算法的巧妙之處在於,i只走一半,也就是i從0到4,而j每次也不用到最後一位(j<N-1-i),因為最後那i+1位已經排好了
//比較次數,i=0時9次,i=1時8次,i=2時7次,i=3時6次,i=4時5次,一共35次
printf("排序之後的數據序列:\n");
for(i=0;i<N;i++)//把排序後的數列顯示出來,%5d代表每一個數佔5位,就是排列的整齊點。
printf("%5d",a[i]);
printf("\n");
}

#include"stdio.h"
#define N 10
main()
{
int a[N],i,j,r,temp;
printf("請輸入%d個整數:\n",N);
for(i=0;i<N;i++)
scanf ("%d",&a[i]);
for(i=0;i<N-1;i++)//用i遍歷數組a。
{r=i;//局部的r值,i從0到8每次不同,r也不同。
for(j=i+1;j<N;j++)//j是從i當前的值一直到最後(前一種排序時每次j的結尾位置不同,到9,到8.到7。)
if(a[j]<a[r])r=j;//用r標記最小的一個值,
if(r!=i)//如果這個最小的值不是a[i],對換,讓i所在值變成最小,意思是a[0]最小,a[1]第二小,以此類推
{temp=a[r];a[r]=a[i];a[i]=temp;}
}
printf("排序之後的數據序列:\n");
for(i=0;i<N;i++)
printf("%5d",a[i]);
printf("\n");

//i=0,j循環9次;i=1,j循環8次。。。。一共45次
}

我把函數改了,這樣可以測試,你去跑一下就明白過程了

#include"stdio.h"
#define N 10
main()
{
int count = 0;
int a[N],i,j,r,temp;
printf("請輸入%d個整數:\n",N);
for(i=0;i<N;i++)
scanf ("%d",&a[i]);
for(i=0;i<N-1;i++)
{r=i;
for(j=i+1;j<N;j++){
if(a[j]<a[r])r=j;

count++;
printf("i:%d\tj:%d\tcount:%d\n",i,j,count);
}
if(r!=i)
{temp=a[r];a[r]=a[i];a[i]=temp;}
}
printf("排序之後的數據序列:\n");
for(i=0;i<N;i++)
printf("%5d",a[i]);
printf("\n%d\n",count);
}

Ⅳ C語言數組排序問題

搞定, 用戶手動輸入數列,可以是正負數。宏定義 MAX_STRING_SIZE 決定用戶輸入的最大字元長度, MAX_ARRAY_SIZE決定用戶最多輸入的整數個數。

bubble_sort() 函數實現冒泡法排序, 第一個參數為被排序數組,第二個參數為數組長度,地三個參數為排序方式, 0 表示從小到大,非0表示從大到小。

/* vim: set et sw=4: */
#include <stdio.h>
#include <string.h>

#define MAX_STRING_SIZE (4096)
#define MAX_ARRAY_SIZE (100)

#define COMPARE(a, b, comp_type) (comp_type == 0 ? (a > b) : (a < b))

/* sort_type = 0, small to large, else in reverse order */
void bubble_sort(int * ar, int size, int sort_type)
{
int swapped, i, val;
do
{
swapped = 0;
for(i = 0; i < size - 1; i++)
{
if(COMPARE(ar[i], ar[i+1], sort_type))
{
val = ar[i];
ar[i] = ar[i+1];
ar[i+1] = val;
swapped++;
}
}
size--;
} while(swapped != 0);
}

int main()
{
char buffer[MAX_STRING_SIZE];
char * p;
int array[MAX_ARRAY_SIZE];
int i, len, num_count;
char ch;

printf("Input number serials, seperated by white spaces!\n");
len = num_count = 0;
while(((ch = getchar()) != '\n') && len < MAX_STRING_SIZE)
{
if(ch >= '0' && ch <= '9')
{
buffer[len++] = ch;
}
else
{
switch(ch)
{
case ' ':
buffer[len++] = '\0';
break;
case '-':
case '+':
buffer[len++] = ch;
break;
default:
printf("\nInvalid character!\n");
return -1;
}

}
}
buffer[len] = '\0';

for(i = 0; i < len; i += (strlen(p)+1))
{
p = &buffer[i];
if(*p != '\0')
{
if(num_count >= MAX_ARRAY_SIZE)
{
printf("array is full (total %d elements), remaining numbers are discarded!\n", num_count);
break;
}
array[num_count++] = atoi(p);
}
}

if(num_count > 1)
{
/* sort first half by reverse order */
bubble_sort(array, num_count/2, 1);
/* sort last part */
if(num_count % 2)
{
bubble_sort(&array[num_count/2 + 1], num_count/2, 0);
}
else
{
bubble_sort(&array[num_count/2], num_count/2, 0);
}
}

printf("After sorting:\n");
for(i = 0; i < num_count; i++)
{
printf("%d ", array[i]);
}
printf("\n");

return 0;
}

Ⅳ c語言數組排序問題

#include
#include
int main(void)
{
char cName[5][10],temp[10];
float fScore[5],ftemp;
int i,j,k;
printf("輸入學生的姓名和成績: ");
for(i=0;i<5;i++)
{
printf("cName[%d]是:",i);
scanf("%s",cName[i]);
printf("成績為:");
scanf("%f",&fScore[i]);
}
for(i=0;i<5;i++)
{
k=i;
for(j=i+1;j<5;j++)
if(fScore[k]>fScore[j])
{
k=j;}

if(k!=i)

{ strcpy(temp,cName[i]);
strcpy(cName[i],cName[k]);
strcpy(cName[k],temp);
ftemp=fScore[i];
fScore[i]=fScore[k];
fScore[k]=ftemp;
}
}
printf("成績由低到高的順序為: ");
for(i=0;i<5;i++)
{

printf("%s的成績為%f ",cName[i],fScore[i]);
}
return 0;

}