1、冒泡排序(最常用)

我們提供的服務(wù)有:網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、相城ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的相城網(wǎng)站制作公司
冒泡排序是最簡(jiǎn)單的排序方法:原理是:從左到右,相鄰元素進(jìn)行比較。每次比較一輪,就會(huì)找到序列中最大的一個(gè)或最小的一個(gè)。這個(gè)數(shù)就會(huì)從序列的最右邊冒出來(lái)。(注意每一輪都是從a[0]開(kāi)始比較的)
以從小到大排序?yàn)槔谝惠啽容^后,所有數(shù)中最大的那個(gè)數(shù)就會(huì)浮到最右邊;第二輪比較后,所有數(shù)中第二大的那個(gè)數(shù)就會(huì)浮到倒數(shù)第二個(gè)位置……就這樣一輪一輪地比較,最后實(shí)現(xiàn)從小到大排序。
2、雞尾酒排序
雞尾酒排序又稱雙向冒泡排序、雞尾酒攪拌排序、攪拌排序、漣漪排序、來(lái)回排序或快樂(lè)小時(shí)排序, 是冒泡排序的一種變形。該算法與冒泡排序的不同處在于排序時(shí)是以雙向在序列中進(jìn)行排序。
原理:數(shù)組中的數(shù)字本是無(wú)規(guī)律的排放,先找到最小的數(shù)字,把他放到第一位,然后找到最大的數(shù)字放到最后一位。然后再找到第二小的數(shù)字放到第二位,再找到第二大的數(shù)字放到倒數(shù)第二位。以此類推,直到完成排序。
3、選擇排序
思路是設(shè)有10個(gè)元素a[1]-a[10],將a[1]與a[2]-a[10]比較,若a[1]比a[2]-a[10]都小,則不進(jìn)行交換。若a[2]-a[10]中有一個(gè)以上比a[1]小,則將其中最大的一個(gè)與a[1]交換,此時(shí)a[1]就存放了10個(gè)數(shù)中最小的一個(gè)。同理,第二輪拿a[2]與a[3]-a[10]比較,a[2]存放a[2]-a[10]中最小的數(shù),以此類推。
4、插入排序
插入排序是在一個(gè)已經(jīng)有序的小序列的基礎(chǔ)上,一次插入一個(gè)元素*
一般來(lái)說(shuō),插入排序都采用in-place在數(shù)組上實(shí)現(xiàn)。
具體算法描述如下:
⒈ 從第一個(gè)元素開(kāi)始,該元素可以認(rèn)為已經(jīng)被排序
⒉ 取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描
⒊ 如果該元素(已排序)大于新元素,將該元素移到下一位置
⒋ 重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 將新元素插入到下一位置中
⒍ 重復(fù)步驟2~5
#include stdio.h
#include string.h#define NUM 3
struct student
{
char name[20]; /*姓名*/
long num; /*12位學(xué)號(hào)*/
double sum; /*總分*/
};
void Create_Students(struct student stu[NUM])
{
struct student *p;
printf("請(qǐng)輸入學(xué)生姓名 學(xué)號(hào)(12位) 總分:\n");
for( p = stu; p stu+NUM; p++)
{
scanf("%s %d %lf",p-name,p-num,p-sum); }
}
void Order_Students(struct student stu[NUM])//起泡法
{
int i,j;
struct student temp;
for(i=NUM-1;i=0;i--)
for(j=0;ji;j++)
if(stu[j].sumstu[j+1].sum)
{
temp = stu[j];
stu[j] = stu[j+1];
stu[j+1]=temp;
}
}
void main()
{
int i=1;
struct student *p;
struct student stu[NUM];
Create_Students(stu);
Order_Students(stu);
printf("%-20s %-13s %-6s %4s\n","姓名","學(xué)號(hào)(12位)","總成績(jī)","名次");
for(p=stu;pstu+NUM;p++,i++)
{
printf("%-20s %-13.0d %-8.2f %2d\n",p-name,p-num,p-sum,i);
}
}//你參考參考,嘿
c語(yǔ)言通過(guò)函數(shù)調(diào)用實(shí)現(xiàn)選擇排序法:
1、寫(xiě)一個(gè)簡(jiǎn)單選擇排序法的函數(shù)名,包含參數(shù)。int SelectSort(int * ListData,int ListLength);
2、寫(xiě)兩個(gè)循環(huán),在循環(huán)中應(yīng)用簡(jiǎn)單選擇插入排序:
int SelectSort(int * ListData,int ListLength)
{
int i , j ;
int length = ListLength;
for(i=0;i=length-2;i++)
{
int k = i;
for(j=i+1;j=length-1;j++)
{
if(ListData[k]ListData[j])
{
k=j;
}
}
if(k!=i)
{
int tmp = ListData[i];
ListData[i] = ListData[k];
ListData[k] = tmp;
}
}
return 0;
}
3、對(duì)編好的程序進(jìn)行測(cè)試,得出測(cè)試結(jié)果:
int main()
{
int TestData[5] = {34,15,6,89,67};
int i = 0;
printf("排序之前的結(jié)果\n");
for(i = 0;i5;i++)
printf("|%d|",TestData[i]);
int retData = SelectSort(TestData,5);
printf("排序之后的結(jié)果:\n");
for(i = 0;i5;i++)
printf("|%d|",TestData[i]);
return 0;
}
4、簡(jiǎn)單選擇排序中,需要移動(dòng)的記錄次數(shù)比較少,主要的時(shí)間消耗在對(duì)于數(shù)據(jù)的比較次數(shù)。基本上,在比較的時(shí)候,消耗的時(shí)間復(fù)雜度為:n*n。
#includestdio.h??
#includestdlib.h??
int?comp(const?void*a,const?void*b)//用來(lái)做比較的函數(shù)。??
{??
return?*(int*)a-*(int*)b;??
}??
int?main()??
{??
int?a[10]?=?{2,4,1,5,5,3,7,4,1,5};//亂序的數(shù)組。??
int?i;??
qsort(a,10,sizeof(int),comp);//調(diào)用qsort排序??
for(i=0;i10;i++)//輸出排序后的數(shù)組??
{??
printf("%d?",a[i]);??
}??
return?0;??
}
c語(yǔ)言和c++中,對(duì)于sort函數(shù)的使用,不同。c語(yǔ)言中沒(méi)有預(yù)置的sort函數(shù),如果在c語(yǔ)言中,要調(diào)用sort函數(shù),就需要自定義一個(gè)用于排序的函數(shù),或者使用c語(yǔ)言自有的qsort函數(shù),其頭文件為stdlib.h。
#includestdio.h
void?sort(float?*a,?int?n)
{
int?i,j,tmp;
for(i=0;?in-1;?i++)
for(j=0;?jn-i-1;?j++)
if(a[j]a[j+1])
{
tmp?=?a[j];
a[j]?=?a[j+1];
a[j+1]?=?tmp;
}
}
void?main()
{
float?a[5];
int?i;
printf("請(qǐng)輸入五個(gè)數(shù)(逗號(hào)隔開(kāi)):");
scanf("%f,%f,%f,%f,%f",a[0],a[1],a[2],a[3],a[4]);
sort(a,5);
printf("排序后為:");
for(i=0;?i5;?i++)
printf("%.2f?",a[i]);
printf("\n");
}
或者三個(gè)數(shù)的。
void sort(int *a, int *b, int *c)
{
int tmp;
if(*a*b){
tmp = *b;
*b = *a;
*a = tmp;
}
if(*a*c){
tmp = *c;
*c = *a;
*a = tmp;
}
if(*b*c){
tmp = *c;
*c = *b;
*b = tmp;
}
return;
}
擴(kuò)展資料:
C語(yǔ)言中沒(méi)有預(yù)置的sort函數(shù)。如果在C語(yǔ)言中,遇到有調(diào)用sort函數(shù),就是自定義的一個(gè)函數(shù),功能一般用于排序。
一、可以編寫(xiě)自己的sort函數(shù)。
如下函數(shù)為將整型數(shù)組從小到大排序。void sort(int *a, int l)//a為數(shù)組地址,l為數(shù)組長(zhǎng)度。
{ ?
int i, j; ?
int v; ? ?//排序主體
for(i = 0; i l - 1; i ++) ? ? ?
for(j = i+1; j l; j ++)
?
{ ? ? ? ? ?
if(a[i] a[j])//如前面的比后面的大,則交換。
? ? ?
{
? ? ? ? ?
v = a[i];
? ? ? ? ?
a[i] = a[j];
? ? ? ? ?
a[j] = v;
? ? ?
}
?
}
}
對(duì)于這樣的自定義sort函數(shù),可以按照定義的規(guī)范來(lái)調(diào)用。
二、C語(yǔ)言有自有的qsort函數(shù)。
功 能: 使用快速排序例程進(jìn)行排序。頭文件:stdlib.h
原型:
void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
參數(shù):
1、待排序數(shù)組首地址。
2、數(shù)組中待排序元素?cái)?shù)量。
3、各元素的占用空間大小4 指向函數(shù)的指針,用于確定排序的順序,這個(gè)函數(shù)必須要自己寫(xiě)比較函數(shù),即使要排序的元素是int,float一類的C語(yǔ)言基礎(chǔ)類型。
一群菜鳥(niǎo)不懂的亂說(shuō)。 我把樓主的代碼改了一些,如下 #includestdio.hint input(int data[], int argc, int *n)
{
int i;
printf("請(qǐng)輸入要輸入數(shù)的個(gè)數(shù)");
scanf("%d", n);
if(*n argc) {
printf("segment fault!");
return -1;
}
for(i = 0; i *n; i++) {
printf("輸入的第%d個(gè)數(shù).", i+1);
scanf("%d", data+i); //canf("%d", data[i]);
}
printf("輸入的數(shù)是:\n");
for(i = 0; i *n; i++) {
printf("%5d\n", data[i]);
}
return 0;
}void sort(int n, int data[])
{
int i, j, temp;
for(i = 0; i n-1; i++) {
for(j = i+1; j n; j++)
if(data[i] data[j]) {
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
printf("排序后的結(jié)果如下:\n");
for(i = 0; i n; i++)
printf("%5d\n", data[i]);
}int main()
{
int data[100];
int n;
if(input(data, 100, n) == -1)
return -1;
sort(n, data);
return 0;
}
對(duì)于以上代碼,做出如下解釋:(1)C語(yǔ)言的參數(shù)有形參和實(shí)參的說(shuō)法,形參在傳遞到函數(shù)內(nèi)的時(shí)候,復(fù)制一個(gè)副本給函數(shù),在函數(shù)內(nèi)部和外部是兩個(gè)完全不同的變量,函數(shù)結(jié)束,空間也被釋放,所以不能在函數(shù)內(nèi)部來(lái)改變外部的值。所以要像樓主這樣用一個(gè)函數(shù)給一個(gè)變量賦值,要用實(shí)參int input(int data[], int argc, int *n)中的int *n就是實(shí)現(xiàn)形式,這種辦法把n的地址傳遞給函數(shù)。當(dāng)然,在調(diào)用函數(shù)的時(shí)候也同樣要傳遞地址指針類型(n)。(2)if(*n argc) {
printf("segment fault!");
return -1;
}這一段是我加進(jìn)去的,因?yàn)榘凑諛侵鞯囊馑迹琩ata數(shù)組的長(zhǎng)度也要傳遞進(jìn)去,但是意思何在?所以只好加了這一段,并把函數(shù)改為有類型的,以檢驗(yàn)是否有數(shù)據(jù)溢出。(3)scanf("%d", data+i); //scanf("%d", data[i]);這里我改動(dòng)的主要原因是為了提升程序速度,scanf("%d", data[i]);同樣可以運(yùn)行,但是尋址一次,又回頭要地址,這樣繞了一圈,沒(méi)有必要。 對(duì)于樓主提幾點(diǎn)建議:(1)C語(yǔ)言的精髓在于指針,剛才說(shuō)到的實(shí)參,就是用指針的概念實(shí)現(xiàn)的。scanf("%d", data+i); 一行,同樣也是把數(shù)組頭指針加上偏移地址,得到所要的地址。(2)C語(yǔ)言編程的時(shí)候特別要注意數(shù)據(jù)的溢出,這是所有初學(xué)者頭疼的問(wèn)題之一。建議在一開(kāi)始就養(yǎng)成習(xí)慣,經(jīng)常檢驗(yàn)數(shù)組的邊界。(3)void main一看就知道是看潭浩強(qiáng)的書(shū)長(zhǎng)大的程序員。建議我們都用int main(){ return 0; }的形式,可以看看C語(yǔ)言之父KR的書(shū)。主函數(shù)的返回值是告訴操作系統(tǒng),這個(gè)函數(shù)是正常退出(返回0),還是異常退出(非0,經(jīng)常是-1)。(4)在做實(shí)際項(xiàng)目的時(shí)候,程序經(jīng)常是要回頭看的,也經(jīng)常是要給別人看以達(dá)到維護(hù)的目的的。除了要養(yǎng)成良好的文檔書(shū)寫(xiě)習(xí)慣以外(學(xué)習(xí)軟件工程以后你就會(huì)掌握),還要養(yǎng)成良好的編程風(fēng)格,這里我建議看《thinking in C++》,并按照里面例題的風(fēng)格,養(yǎng)成自己的習(xí)慣。
當(dāng)前標(biāo)題:c語(yǔ)言怎么用排序函數(shù) c語(yǔ)言排序的函數(shù)
網(wǎng)頁(yè)路徑:http://chinadenli.net/article8/heppip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)站設(shè)計(jì)、手機(jī)網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、靜態(tài)網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)