① 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語言如何對大量數字進行排序
如果是C語言的話只能手寫堆排序、歸並排序或者快速排序等等
如果是用C++的話可以看下面:
10W量級直接考慮使用STL的sort函數,用法自行網路或者參見http://www.cplusplus.com/reference/algorithm/sort/
sort函數默認是升序排序,要降序排序可以傳cmp函數過去或者sort完了reverse
1000W量級考慮使用計數排序或者基數排序,這兩種排序對被排序數字的大小有一定限制
如果是1000W量級的實數排序,或者數字可能很大的話,那麼還是回到之前說的sort
STL里提供了很多O(nlogn)級別的排序函數,比如sort、qsort、stable_sort
另外還有簡化歸並排序代碼用的merge函數等等
以上所有函數均能在cplusplus.com查到詳細用法
③ C語言qsort 對於malloc分配的二維數組 cmp函數怎麼寫,求大神賜教!!
看起來你真的暈了。
先明確問題,你打算操作一個數組,數組的每個元素是一個指針,指向2個元素的數組。元素的大小關系為先比較第一個元素,第一個元素相同比較第二個元素。
如果這是樣,你的分配代碼就錯了。
int
*b,**a;
a
=
(int**)malloc(500000*sizeof(int*));
//這里應是對int*來分配。
for(i=0;i<500000;i++)
{
b
=
malloc(2*sizeof(int));
a[i]
=
b;
}
qsort的調用是對。
cmp的寫法有問題,入參實際是數組元素的指針,這里元素是int*,入參應該是int**,而你要比較的數組,這個指針指向的內容。
int
cmp(const
void*
a,const
void*
b)
{
int
*ap
=
*(int**)a;
int
*bp
=
*(int**)b;
if(ap[0]
==
bp[0])
return
ap[1]
-
bp[1];
else
return
a[0]
-
b[0];
}
④ c語言中strcmp函數的cmp是什麼單詞的縮寫
1、cmp 是 compare,比較的縮寫。
2、strcmp是C語言中頭文件<string.h>(字元串函數)中定義的一個用於對兩組字元串進行比較的函數,它的返回值是int類型。
假設有兩組字元串cs和ct,當cs<ct時,函數返回一個負數;當cs==ct時,函數返回0;當cs>ct時,函數返回一個正數。
即:兩個字元串自左向右逐個字元相比(按ASCII值大小相比較),直到出現不同的字元或遇'\0'為止。如:"A"<"B" ,"a">"A" ,"computer">"compare" ,"comput">"comp"
strcmp函數原型為:int strcmp(const char *s1,const char * s2);
⑤ 如何用c語言將許多個整數變成字元串並比較它們的大小,將其按照降序排列
可以先將這些整數放進一個數組里
然後將它們進行逆序排序
再將它們轉換成字元串存入到一個字元串數組里
一個簡單的代碼如下
#include<stdio.h>
#include<stdlib.h>
#defineMAX_NUM20
#defineNUMsizeof(a)/sizeof(int)
voidint_to_str(int*a,chars[][MAX_NUM],intn)
{
inti;
for(i=0;i<n;++i)
snprintf(s[i],MAX_NUM,"%d",a[i]);
}
intcmp(constvoid*a,constvoid*b)
{
int*x=(int*)a;
int*y=(int*)b;
return*x<*y?1:0;
}
intmain(intargc,char**argv)
{
inta[]={1,5,9,8,6,4,3,7,2,0};
chars[NUM][MAX_NUM];
inti;
for(i=0;i<NUM;++i)
printf("%d",a[i]);
printf(" ");
//排序
qsort(a,NUM,sizeof(int*),cmp);
for(i=0;i<NUM;++i)
printf("%d",a[i]);
printf(" ");
//轉換
int_to_str(a,s,NUM);
for(i=0;i<NUM;++i)
printf("%s",s[i]);
printf(" ");
return0;
}
自然的也可以轉換後再排序
代碼如下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#defineMAX_NUM20
#defineNUMsizeof(a)/sizeof(int)
voidint_to_str(int*a,chars[][MAX_NUM],intn)
{
inti;
for(i=0;i<n;++i)
snprintf(s[i],MAX_NUM,"%d",a[i]);
}
intcmp(constvoid*a,constvoid*b)
{
returnstrcmp((char*)a,(char*)b)>0?0:1;
}
intmain(intargc,char**argv)
{
inta[]={1,5,9,8,6,4,3,7,2,0};
chars[NUM][MAX_NUM];
inti;
//轉換
int_to_str(a,s,NUM);
//排序
qsort(s,NUM,sizeof(char)*MAX_NUM,cmp);
for(i=0;i<NUM;++i)
printf("%s",s[i]);
printf(" ");
return0;
}
⑥ c語言輸入n個數 ,然後奇數按照升序排列,偶數按降序排列
由於n不確定,故選擇鏈表存儲輸入數據,這里選用一個無頭結點的鏈表。編寫創建鏈表、釋放鏈表、排序三個函數,在主函數中調用這些函數來完成。代碼如下:
//#include"stdafx.h"//Ifthevc++6.0,withthisline.
#include"stdio.h"
#include"stdlib.h"
typedefstructnode{
intn;
structnode*next;
}*NODE,node;
voidfreenode(NODEp){//釋放鏈表
if(p->next)freenode(p->next);
free(p);
}
NODECreateLink(void){//創建鏈表
intx;
NODEhead,p;
if((p=head=(NODE)malloc(sizeof(node)))==NULL){//創建頭結點
printf("Establishaheadnodefailure...");
returnNULL;
}
printf("Inputsomedata(non-numericend)... ");
while(scanf("%d",&x)==1){
if((p->next=(NODE)malloc(sizeof(node)))==NULL){
printf("Failedtocreatenode...");
freenode(head);
returnNULL;
}
p->next->n=x;
p=p->next;
}
p->next=NULL;
p=head;//刪除頭結點
head=head->next;
free(p);
returnhead;
}
voidmysort(NODEp){//奇數升排偶數降排
NODEp1,p2;
for(;p;p=p->next){
for(p1=p,p2=p1->next;p2;p2=p2->next)
if(p->n&1&&p2->n&1&&p1->n>p2->n)
p1=p2;
elseif(!(p->n&1)&&!(p2->n&1)&&p1->n<p2->n)
p1=p2;
if(p1!=p){
p1->n^=p->n;
p->n^=p1->n;
p1->n^=p->n;
}
}
}
intmain(void){
NODEhead=CreateLink(),p;
mysort(head);//按要求排序
for(p=head;p;p=p->next)//打出來看看
printf("%d",p->n);
freenode(head);
printf(" ");
return0;
}
⑦ 如何用C語言排序
試想一下,如果讓你自己設計qsort函數,需要些什麼東西,首地址要有吧,總共有幾個元素要有吧,每個元素佔多大的內存要有吧(想想就知道函數內部要根據內存塊的大小交換數據實現排序),最後一個規則總要有吧,qsort的靈活性在於規則是活的不是死的,其實大多數語言的排序都是類似的機制啦。。。看下qsort的原型
void
qsort(void
*base,int
nelem,int
width,int
(*fcmp)(const
void
*,const
void
*));
base就是所謂的首地址,nelem就是元素個數,width,就是每個元素的大小,fcmp是一個函數指針,這里函數的定義要類似於int
cmp(const
void*a,const
void*b),其實很多人不知道怎麼使用qsort主要是在於對這個函數不懂得如何寫,其實想想就知道函數把每個元素的地址扔給比較函數,根據比較函數的返回值來決定到底是a在前面還是b在前面,所以在函數裡面要先取出值,所以一般的寫法就是
int
cmp(const
void*a,const
void*b)
{
return
*(t*)a-*(t*)b;
}
先強制轉換成t類型再用取值符號*取出指,函數之所以用空指針是因為空指針可以指向任何類型,對於基本類型,只要將t修改為基本類型就行了,對於結構體之類的的指針,則return
((t*)a)->x-((t*)b)->x;其中t就是結構體的名稱,x就是你要比較的欄位,當然如果你要降序的話就將ab顛倒就行了,說了這么多,寫一個例子,比如要對下面的數組排序
int
a[5]={2,10,5,4,0};
qsort(a,5,sizeof(int),cmp);
比較函數
int
cmp(const
void*a,const
void*b)
{
return
*(int*)a-*(int*)b;
}
。。呵呵,啰嗦了點。希望對你有幫助
⑧ C語言中對結構體qsort cmp函數怎麼寫
int cmp(struct data v1,struct data v2)
{
if(v1.cnt > v2.cnt) return 1;
else if(v1.cnt < v2.cnt) return -1;
else return strcmp(v1.w,v2.w);
}
⑨ c語言中合並兩個降序數組,使合並後的數組仍然保持降序排列
#include<stdio.h>
#include<stdlib.h>
#define N 100
int cmp(const void*a,const void*b)
{//快速排序比較函數
int *x=(int*)a;
int *y=(int*)b;
return *y-*x;
}
int main()
{
int a[N]={9,7,5,3,1};
int b[N]={8,6,4,2,0};
int sum[2*N]={0};//合並數組
int k=0;//合並數組元素個數的計數
for(int i=0;i<5;i++)
{
sum[k++]=a[i];//a數組元素賦值給sum數組
}
for(int i=0;i<5;i++)
{
sum[k++]=b[i];//b數組元素賦值給sum數組
}
qsort(sum,10,sizeof(sum[0]),cmp);//降序排序
for(int i=0;i<k;i++)//輸出
printf("%d ",sum[i]);
return 0;
}