1、冒泡排序(最常用)
創(chuàng)新互聯(lián)是專(zhuān)業(yè)的湄潭網(wǎng)站建設(shè)公司,湄潭接單;提供成都做網(wǎng)站、成都網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行湄潭網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
冒泡排序是最簡(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、雞尾酒排序
雞尾酒排序又稱(chēng)雙向冒泡排序、雞尾酒攪拌排序、攪拌排序、漣漪排序、來(lái)回排序或快樂(lè)小時(shí)排序, 是冒泡排序的一種變形。該算法與冒泡排序的不同處在于排序時(shí)是以雙向在序列中進(jìn)行排序。
原理:數(shù)組中的數(shù)字本是無(wú)規(guī)律的排放,先找到最小的數(shù)字,把他放到第一位,然后找到最大的數(shù)字放到最后一位。然后再找到第二小的數(shù)字放到第二位,再找到第二大的數(shù)字放到倒數(shù)第二位。以此類(lèi)推,直到完成排序。
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ù),以此類(lèi)推。
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 cstdlib 或 #include stdlib.h
qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2))
參數(shù)表
*base: 待排序的元素(數(shù)組,下標(biāo)0起)。
num: 元素的數(shù)量。
width: 每個(gè)元素的內(nèi)存空間大?。ㄒ宰止?jié)為單位)??捎胹izeof()測(cè)得。
int(*)compare: 指向一個(gè)比較函數(shù)。*elem1 *elem2: 指向待比較的數(shù)據(jù)。
比較函數(shù)的返回值
返回值是int類(lèi)型,確定elem1與elem2的相對(duì)位置。
elem1在elem2右側(cè)返回正數(shù),elem1在elem2左側(cè)返回負(fù)數(shù)。
控制返回值可以確定升序/降序。
產(chǎn)生隨機(jī)數(shù)的函數(shù)也是rand(),不是rank().
#includeiostream
#includealgorithm
#includestring.h
using namespace std;
#define NUM 100
struct Str{char str[20];};
bool cmp(Str a,Str b)
{
return strcmp(a.str,b.str)0;
}
int main()
{
int n;
Str str[NUM];
scanf("%d%*c",n);//輸入人的個(gè)數(shù)
for(int i=0;in;i++)
gets(str[i].str);//依次輸入每個(gè)人的姓名,用回車(chē)鍵隔開(kāi)
sort(str,str+n,cmp);
printf("排序后:\n");
for(int i=0;in;i++)
puts(str[i].str);
return 0;
}
這樣子可以嗎?
#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);
}
}//你參考參考,嘿
#include stdio.h
#include string.h
#define MAX_NAME 20 //最大名字長(zhǎng)度
#define MAX_NUM 100 //最大學(xué)生人數(shù)
void sort_bubble(char (*pc)[MAX_NAME],int n)//排序函數(shù)
{
int i,j;
char str[MAX_NAME];
for(i=0;in-1;i++)
{
for(j=i+1;jn;j++)
{
if(strcmp(pc[i],pc[j])0)
{
strcpy(str,pc[i]);
strcpy(pc[i],pc[j]);
strcpy(pc[j],str);
}
}
}
}
void display_name(char (*pc)[MAX_NAME],int n)//顯示這n個(gè)姓名
{
int i;
for(i=0;in;i++)
{
printf("%s\n",pc[i]);
}
}
int main()
{
int i=1,n;
char str[MAX_NUM][MAX_NAME];
printf("請(qǐng)輸入學(xué)生總數(shù):");
scanf("%d",n);
while(i=n)
{
printf("請(qǐng)輸入第%d個(gè)學(xué)生姓名:",i);
scanf("%s",str[i++-1]);
}
printf("排序前的學(xué)生名單如下:\n");
display_name(str,n);
sort_bubble(str,n);
printf("排序后的學(xué)生名單如下:\n");
display_name(str,n);
return 0;
}
說(shuō)明:
1:采用的是冒泡排序,用快速排序當(dāng)然快些,但我忘了
2:已驗(yàn)證通過(guò),結(jié)果正確。
3:隨意輸入人數(shù)和姓名,只要數(shù)組不越界就沒(méi)有問(wèn)題!
4:兩個(gè)函數(shù):排序和顯示
5:給分+好評(píng)
#include string.h
/*輸入若干學(xué)生姓名*/
void ReadName(char *name[],int n)
{ int i;
for(i=0;in;i++)
gets(name[i]);
}
/*進(jìn)行排序,從小到大*/
void sort(char *name[],int n)
{
char mStr[80];
int i,j;
for(i=0;in-1;i++)
{ for(j=i+1;jn;j++)
{ if(strcmp(name[i],name[j])0)
{ strcpy(mStr,name[i]);
strcpy(name[i],name[j]);
strcpy(name[j],mStr);
}
}
}
}
/* 輸出 */
void Output(char *name[],int n)
{
int i;
for(i=0;in;i++) puts(name[i]);
}
網(wǎng)站名稱(chēng):c語(yǔ)言名字排序函數(shù) c語(yǔ)言排序的函數(shù)
URL分享:http://chinadenli.net/article16/dodsogg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、云服務(wù)器、網(wǎng)站收錄、外貿(mào)網(wǎng)站建設(shè)、面包屑導(dǎo)航、全網(wǎng)營(yíng)銷(xiāo)推廣
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容