在應用中,如果我們不需要自己來編寫排序函數的話,可以通過C/C++中已經實現的庫函數來完成排序任務。
一、sort函數
sort函數在C++中<algorithm>中,若要使用,需要加上頭文件#include <algorithm>,它有如下幾種形式:
(1)默認情況按升序排列:
假設數組為a[n],下標從0開始,對整個數組按升序排列:
int a[110], n; //n表示元素個數 sort(a, a+n); //整個數組按升序排列
(2)若要將某個區間的元素排列,比如需要將第3到第9個元素升序排列:
sort(a+3, a+10); //3~9是7個數,注意後面那個數字為什麼是10
(3)如果需要按照降序排列,那麼需要寫一個cmp比較函數(一般按照升序排列的話,會調用默認的cmp函數:
bool cmp(int a, int b) { return b < a; //判斷a與b的大小,因為降序,要b-a }
再使用sort函數:
sort(a, a+n, cmp); //降序排列,0~n-1
(4) cmp功能是很強大的,你可以按照任意的方法,任意的組織自己的數組該如何排列:
下面給個例子:對學生的成績按降序排列:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; struct student { char name[20]; //學生姓名 int grade; //學生分數 }ST[100]; bool cmp(student a, student b) //注意這裡是bool { return a.grade > b.grade; //判斷大小,降序 } int main() { int n, gd; char str[20]; scanf("%d", &n); //輸入學生人數 for(int i = 0; i < n; i++) { scanf("%s%d", str, &gd); //輸入學生姓名和成績 strcpy(ST[i].name, str); //存入學生結構體 ST[i].grade = gd; } sort(ST, ST+n, cmp); for(int i = 0; i < n; i++) printf("第%d名:%s %d\n", i+1, ST[i].name, ST[i].grade); return 0; }
運行結果:
sort函數很強大,復雜度O(nlog n),有興趣的讀者還可以自行探討更多。
二、qsort函數
qsort函數,也就是快速排序算法,在C的<stdlib>庫中,需加入頭文件#include <cstdlib> 或#include <stdlib.h>。
調用qsort函數需要寫cmp比較函數。
給出按升序排列的例子:
int cmp(const void* a, const void* b) //注意這裡是int { return (int*)a - (int*)b; }
調用:
qsort(a, n, sizeof(int), cmp); //a為數組,n為個數
如果需要按照自己的意願排列,那麼同樣重寫cmp比較函數,就可以完成,和sort函數類似。時間復雜度為O(n log n),但是某些情況要比sort函數好。
樓上都沒看過吧,
在stdlib.h頭文件中。
有qsort() //快速排序
bsearch() //折半查找
使用方法我不介紹了,,
你自己看這個吧
baike.baidu.com/view/982231.htm
//問題很多,第一個就是paiux 和函數重名
//還有,就是函數返回只能返回一個數啊
#include<stdio.h>
int main()
{
int paixu(int a,int b,int c);
int a,b,c,pai;
while(scanf("%d %d %d",&a,&b,&c)!=-1)
{
pai=paixu(a,b,c);
printf("%d %d %d\n",pai);
}
return 0;
}
int paixu(int a,int b,int c)
{
int pai;
if(a>b)
{pai=b; b=a; a=pai;}
if (a>c)
{pai=c; c=a; a=pai;}
if(b>c)
{
pai=b;b=c;c=pai;
}
printf("%d %d %d\n",a,b,c);
return a;
}