樓上的用的是C++
創(chuàng)新互聯(lián)服務(wù)項目包括張家口網(wǎng)站建設(shè)、張家口網(wǎng)站制作、張家口網(wǎng)頁制作以及張家口網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,張家口網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到張家口省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
若單純的用C那就是這樣
#includestdio.h
#define
"NO.%d
%d
%d
%d
%d
%3.2f
%3.2f\n",1+i,stu[i].num,stu[i].mat,stu[i].ENG,stu[i].com,stu[i].aver,stu[i].total//宏定義節(jié)約時間
struct
student
{
int
num;
int
mat;
int
ENG;
int
com;
float
aver;
float
total;
}stu[10];//定義結(jié)構(gòu)體變量
void
main()
{
int
i;
void
take_turn_print(struct
student
stu1[10])
;
float
sum(int
x,int
y,int
z);//聲明求和函數(shù)
for(i=0;i10;i++)
scanf("%d%d%d%d",stu[i].num,stu[i].mat,stu[i].ENG,stu[i].com);
for(i=0;i10;i++)
{
stu[i].total=sum(stu[i].mat,stu[i].ENG,stu[i].com);//調(diào)用求和函數(shù)
stu[i].aver=stu[i].total/3;
}
take_turn_print(stu);//調(diào)用排序
打印函數(shù)
}
void
take_turn_print(struct
student
stu1[10])
{
void
change(int
*x,int
*y);//聲明換位函數(shù)
void
change1(float
*x,float
*y);//聲明換位函數(shù)
int
i,j;
for(j=0;j9;j++)//冒泡排序
為理解簡單
就沒用別的排序方法
哈哈
{
for(i=0;i9-j;i++)
{
if(stu1[i].averstu1[i+1].aver)
{
change(stu1[i].num,stu1[i+1].num);//
值交換
change(stu1[i].mat,stu1[i+1].mat);//
值交換
change(stu1[i].ENG,stu1[i+1].ENG);//
值交換
change(stu1[i].com,stu1[i+1].com);//
值交換
change1(stu1[i].aver,stu1[i+1].aver);//
值交換
change1(stu1[i].total,stu1[i+1].total);//
值交換
}
}
}
for(i=0;i10;i++)
printf(print);//打印
}
void
change(int
*x,int
*y)
{
int
i;
i=*x;
*x=*y;
*y=i;//利用指針做變量替換
}
void
change1(float
*x,float
*y)
{
float
i;
i=*x;
*x=*y;
*y=i;//利用指針做變量替換
}
float
sum(int
x,int
y,int
z)
{
float
i;
i=(float)(x+y+z);
return(i);
}
前幾天也是幫同學做這樣的題
一模一樣
看來你也是WH大學的
首先這是一種快速排序的算法,你也應(yīng)該知道,快速排序就是選擇序列中的一個元素作為基準,通過循環(huán)找到這個基準最終的位置,并把所有小于這個基準的元素移到這個位置的左邊,大于基本的元素移到右邊,這樣再對這個基準的左右兩邊分別遞歸調(diào)用自己,最終就能得到排序的結(jié)果。
再來解釋一下這個例子,它選擇的基準就是v[(left+right)/2],然后將這個基準雨v[left]交換,現(xiàn)在假設(shè)你想從頭排序到最后,則你會將left傳個0,也就是他將這個基準和V[0]交換了,這個時候開始循環(huán),因為第一個元素是基準,所以從第二個元素開始循環(huán)(也就是left+1),然后到if判斷部分,如果v[i]v[left],也就是說這個時候已經(jīng)至少有一個元素比基準小了,所以基準至少在v[1]或者之后了,所以他把你找到的這個比基準小的v[i]和v[++last]交換,這時候v[i]的位置已經(jīng)是在基準的正確位置或者之前了,不會在基準之后的,所以這就實現(xiàn)了把比基準小的元素移到基準的正確位置之前,你說的【第一遍執(zhí)行過程中,第8行l(wèi)ast=left=0,那么到了11行時相當于交換v[1]和v[0+1]】這沒有錯,確實是在自己交換自己,但是這樣并不違背前面的思路不是么?當if條件不滿足的時候,last是不會增加的,但是i會一直加1,所以last和i就會不同,這只是在將比基準小的元素移到基準之前,每有一個比基準小的,last就加1,這樣當你循環(huán)一遍之后的last值就是基準應(yīng)該在的位置,而且這個時候,所有比基本小的元素也都在last之前了,這時候last位置的元素也是比基準小的,這沒關(guān)系,因為之后還有一句swap[v,last,left],到目前位置,基準的位置找到了,基準左邊的元素都比基準小,右邊都比基準大,再對基準的左右兩邊遞歸調(diào)用自己,就完成了序列的排序。
1、冒泡排序(最常用)
冒泡排序是最簡單的排序方法:原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數(shù)就會從序列的最右邊冒出來。(注意每一輪都是從a[0]開始比較的)
以從小到大排序為例,第一輪比較后,所有數(shù)中最大的那個數(shù)就會浮到最右邊;第二輪比較后,所有數(shù)中第二大的那個數(shù)就會浮到倒數(shù)第二個位置……就這樣一輪一輪地比較,最后實現(xiàn)從小到大排序。
2、雞尾酒排序
雞尾酒排序又稱雙向冒泡排序、雞尾酒攪拌排序、攪拌排序、漣漪排序、來回排序或快樂小時排序, 是冒泡排序的一種變形。該算法與冒泡排序的不同處在于排序時是以雙向在序列中進行排序。
原理:數(shù)組中的數(shù)字本是無規(guī)律的排放,先找到最小的數(shù)字,把他放到第一位,然后找到最大的數(shù)字放到最后一位。然后再找到第二小的數(shù)字放到第二位,再找到第二大的數(shù)字放到倒數(shù)第二位。以此類推,直到完成排序。
3、選擇排序
思路是設(shè)有10個元素a[1]-a[10],將a[1]與a[2]-a[10]比較,若a[1]比a[2]-a[10]都小,則不進行交換。若a[2]-a[10]中有一個以上比a[1]小,則將其中最大的一個與a[1]交換,此時a[1]就存放了10個數(shù)中最小的一個。同理,第二輪拿a[2]與a[3]-a[10]比較,a[2]存放a[2]-a[10]中最小的數(shù),以此類推。
4、插入排序
插入排序是在一個已經(jīng)有序的小序列的基礎(chǔ)上,一次插入一個元素*
一般來說,插入排序都采用in-place在數(shù)組上實現(xiàn)。
具體算法描述如下:
⒈ 從第一個元素開始,該元素可以認為已經(jīng)被排序
⒉ 取出下一個元素,在已經(jīng)排序的元素序列中從后向前掃描
⒊ 如果該元素(已排序)大于新元素,將該元素移到下一位置
⒋ 重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 將新元素插入到下一位置中
⒍ 重復(fù)步驟2~5
#include?stdio.h
void?mysort(int?*p,int?n){
int?i,j,k;
for(i=0;in;i++){
for(k=i,j=k+1;jn;j++)
if(p[k]p[j])
k=j;
if(k-i)
j=p[k],p[k]=p[i],p[i]=j;
}
}
int?main(int?argc,char?*argv[]){
int?a[10]={100,90,80,70,60,50,40,30,20,10,},i;
mysort(a,10);
for(i=0;i10;printf("%d?",a[i++]));
printf("\n");
return?0;
}
當前標題:c語言編程函數(shù)排序,排序函數(shù)C語言
文章路徑:http://m.kartarina.com/article8/heihip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站改版、Google、服務(wù)器托管、電子商務(wù)、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)