㈠ c語言怎麼用自定義函數排序
用冒泡排序法,代碼如下:for(j=0;j<=9;j++)
//10人的總成績進行排序
{
for
(i=0;i<10-j;i++)
if
(a[i]>a[i+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;}
}
for(i=0;i<10;i++)
//列印排序後的總分{printf("%5d",a[i]);}
㈡ C語言中的排序函數是什麼
include <cstdlib> 或 #include <stdlib.h>
qsort(void* base, size_t num, size_t width, int(*)compare(const void* elem1, const void* elem2))
參數表
*base: 待排序的元素(數組,下標0起)。
num: 元素的數量。
width: 每個元素的內存空間大小(以位元組為單位)。可用sizeof()測得。
int(*)compare: 指向一個比較函數。*elem1 *elem2: 指向待比較的數據。
比較函數的返回值
返回值是int類型,確定elem1與elem2的相對位置。
elem1在elem2右側返回正數,elem1在elem2左側返回負數。
控制返回值可以確定升序/降序。
產生隨機數的函數也是rand(),不是rank().
㈢ c語言函數庫裡面有排序的函數嗎
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
base是需要sort的數組,num是base的大小,width是每個元素的大小,以byte為單位,compare是一個比較大小的函數的指針,當然是你自己寫的了,因為qsort也不知道你要排序的是什麼東西啊,你就告訴它是elem1大呢還是elem2大就行了。
舉例:
#include <iostream.h>
#include <stdlib.h>
#include <string.h>
int compare(const void* a, const void* b);
char* list[5]={"cattle","car","cabet","cap","canon"};
void main()
{
//cout<<sizeof(list[2]);
qsort((void *)list,5,sizeof(list[0]),compare);
for(int i=0; i<5; i++)
cout <<list[i] <<endl;
}
int compare(const void* a, const void* b)
{
return strcmp(*(char**)a, *(char**)b);
}
㈣ c語言怎麼用自定義函數排序
#include <stdio.h>
#include <string.h>#define NUM 3
struct student
{
char name[20]; /*姓名*/
long num; /*12位學號*/
double sum; /*總分*/
};
void Create_Students(struct student stu[NUM])
{
struct student *p;
printf("請輸入學生姓名 學號(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;j<i;j++)
if(stu[j].sum<stu[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","姓名","學號(12位)","總成績","名次");
for(p=stu;p<stu+NUM;p++,i++)
{
printf("%-20s %-13.0d %-8.2f %2d\n",p->name,p->num,p->sum,i);
}
}//你參考參考,嘿
㈤ c語言 排序函數
首先這是一種快速排序的演算法,你也應該知道,快速排序就是選擇序列中的一個元素作為基準,通過循環找到這個基準最終的位置,並把所有小於這個基準的元素移到這個位置的左邊,大於基本的元素移到右邊,這樣再對這個基準的左右兩邊分別遞歸調用自己,最終就能得到排序的結果。
再來解釋一下這個例子,它選擇的基準就是v[(left+right)/2],然後將這個基準雨v[left]交換,現在假設你想從頭排序到最後,則你會將left傳個0,也就是他將這個基準和V[0]交換了,這個時候開始循環,因為第一個元素是基準,所以從第二個元素開始循環(也就是left+1),然後到if判斷部分,如果v[i]<v[left],也就是說這個時候已經至少有一個元素比基準小了,所以基準至少在v[1]或者之後了,所以他把你找到的這個比基準小的v[i]和v[++last]交換,這時候v[i]的位置已經是在基準的正確位置或者之前了,不會在基準之後的,所以這就實現了把比基準小的元素移到基準的正確位置之前,你說的【第一遍執行過程中,第8行last=left=0,那麼到了11行時相當於交換v[1]和v[0+1]】這沒有錯,確實是在自己交換自己,但是這樣並不違背前面的思路不是么?當if條件不滿足的時候,last是不會增加的,但是i會一直加1,所以last和i就會不同,這只是在將比基準小的元素移到基準之前,每有一個比基準小的,last就加1,這樣當你循環一遍之後的last值就是基準應該在的位置,而且這個時候,所有比基本小的元素也都在last之前了,這時候last位置的元素也是比基準小的,這沒關系,因為之後還有一句swap[v,last,left],到目前位置,基準的位置找到了,基準左邊的元素都比基準小,右邊都比基準大,再對基準的左右兩邊遞歸調用自己,就完成了序列的排序。
㈥ c語言中排序方法
1、冒泡排序(最常用)
冒泡排序是最簡單的排序方法:原理是:從左到右,相鄰元素進行比較。每次比較一輪,就會找到序列中最大的一個或最小的一個。這個數就會從序列的最右邊冒出來。(注意每一輪都是從a[0]開始比較的)
以從小到大排序為例,第一輪比較後,所有數中最大的那個數就會浮到最右邊;第二輪比較後,所有數中第二大的那個數就會浮到倒數第二個位置……就這樣一輪一輪地比較,最後實現從小到大排序。
2、雞尾酒排序
雞尾酒排序又稱雙向冒泡排序、雞尾酒攪拌排序、攪拌排序、漣漪排序、來回排序或快樂小時排序, 是冒泡排序的一種變形。該演算法與冒泡排序的不同處在於排序時是以雙向在序列中進行排序。
原理:數組中的數字本是無規律的排放,先找到最小的數字,把他放到第一位,然後找到最大的數字放到最後一位。然後再找到第二小的數字放到第二位,再找到第二大的數字放到倒數第二位。以此類推,直到完成排序。
3、選擇排序
思路是設有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個數中最小的一個。同理,第二輪拿a[2]與a[3]-a[10]比較,a[2]存放a[2]-a[10]中最小的數,以此類推。
4、插入排序
插入排序是在一個已經有序的小序列的基礎上,一次插入一個元素*
一般來說,插入排序都採用in-place在數組上實現。
具體演算法描述如下:
⒈ 從第一個元素開始,該元素可以認為已經被排序
⒉ 取出下一個元素,在已經排序的元素序列中從後向前掃描
⒊ 如果該元素(已排序)大於新元素,將該元素移到下一位置
⒋ 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
⒌ 將新元素插入到下一位置中
⒍ 重復步驟2~5
㈦ C語言 排序 函數
一群菜鳥不懂的亂說。 我把樓主的代碼改了一些,如下 #include<stdio.h>int input(int data[], int argc, int *n)
{
int i;
printf("請輸入要輸入數的個數");
scanf("%d", n);
if(*n > argc) {
printf("segment fault!");
return -1;
}
for(i = 0; i < *n; i++) {
printf("輸入的第%d個數.", i+1);
scanf("%d", data+i); //canf("%d", &data[i]);
}
printf("輸入的數是:\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("排序後的結果如下:\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;
}
對於以上代碼,做出如下解釋:(1)C語言的參數有形參和實參的說法,形參在傳遞到函數內的時候,復制一個副本給函數,在函數內部和外部是兩個完全不同的變數,函數結束,空間也被釋放,所以不能在函數內部來改變外部的值。所以要像樓主這樣用一個函數給一個變數賦值,要用實參int input(int data[], int argc, int *n)中的int *n就是實現形式,這種辦法把n的地址傳遞給函數。當然,在調用函數的時候也同樣要傳遞地址指針類型(&n)。(2)if(*n > argc) {
printf("segment fault!");
return -1;
}這一段是我加進去的,因為按照樓主的意思,data數組的長度也要傳遞進去,但是意思何在?所以只好加了這一段,並把函數改為有類型的,以檢驗是否有數據溢出。(3)scanf("%d", data+i); //scanf("%d", &data[i]);這里我改動的主要原因是為了提升程序速度,scanf("%d", &data[i]);同樣可以運行,但是定址一次,又回頭要地址,這樣繞了一圈,沒有必要。 對於樓主提幾點建議:(1)C語言的精髓在於指針,剛才說到的實參,就是用指針的概念實現的。scanf("%d", data+i); 一行,同樣也是把數組頭指針加上偏移地址,得到所要的地址。(2)C語言編程的時候特別要注意數據的溢出,這是所有初學者頭疼的問題之一。建議在一開始就養成習慣,經常檢驗數組的邊界。(3)void main一看就知道是看潭浩強的書長大的程序員。建議我們都用int main(){ return 0; }的形式,可以看看C語言之父K&R的書。主函數的返回值是告訴操作系統,這個函數是正常退出(返回0),還是異常退出(非0,經常是-1)。(4)在做實際項目的時候,程序經常是要回頭看的,也經常是要給別人看以達到維護的目的的。除了要養成良好的文檔書寫習慣以外(學習軟體工程以後你就會掌握),還要養成良好的編程風格,這里我建議看《thinking in C++》,並按照裡面例題的風格,養成自己的習慣。
㈧ 【C語言】如果想用qsort這樣的系統自帶函數給一個二維數組的某一橫行排序怎麼做
qsort是編譯器函數庫自帶的快速排序函數。其原型為:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
參數含義如下:
base: 待排序數組首地址。
num: 數組中待排序元素數量。
width: 各元素的佔用空間大小。
compare: 指向函數的指針,用於確定排序的順序。
比較難以理解的是compare函數指針,其確定了如何去排序,通過修改該函數指針指向的函數體,可以對復雜類型進行排序,如結構體等。 也可以改變排序方式,如升序或降序。
要達到問題中的效果,需要在第一個參數傳入數據所在行的首地址,第二個參數傳入一行中元素的個數,第三行傳入每個元素佔用的空間,第四個傳入自定義的比較函數指針(函數名)。
下面就以一個3行4列整型數組a[3][4],對其第二行(a[1])進行升序排序為例,寫一個代碼,輔助理解。
#include<stdio.h>
#include<stdlib.h>
intcmp(constvoid*a,constvoid*b)
{
return*((int*)a)>*((int*)b);//由於是整型數組,所以將指針轉為整型指針後取值,再比較。
}
intmain()
{
inta[3][4]=
{
5,1,54,6,
22,12,44,32,
34,5,2,1
};//定義的原始數組,可以看到是亂序的。
inti,j;
qsort(a[1],4,sizeof(int),cmp);
//以下代碼輸出數組元素值,以驗證排序結果。
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%3d",a[i][j]);
printf(" ");
}
return0;
}
程序運行後輸出:
51546
12223244
34521
可以看到第二行已經升序排列,而其它兩個沒有變化。