當前位置:首頁 » 編程語言 » c語言qsort

c語言qsort

發布時間: 2022-06-14 08:05:03

1. c語言關於qsort函數用法

第四個是回調函數的用法

  1. 由於qsort規定是int型函數,所以一定是int型,所以這點他不如c++的sort函數

  2. const void *代表的是指針常量,即該指針只能指向a,不允許改變指向,保證了指針的安全性

  3. (int *)a是強制將傳進來的void 型指針轉化為int型指針,*(int *)a的 * 是解析強制轉化後int型指針a裡面的int型數據,最後由return返回

2. C語言當中的qsort函數


能:
使用快速排序常式進行排序

法:
void
qsort(void
*base,int
nelem,int
width,int
(*fcmp)(const
void
*,const
void
*));
參數:1
待排序數組首地址
2
數組中待排序元素數量
3
各元素的佔用空間大小
4
指向函數的指針,用於確定排序的順序
其實c中的函數不用死記,知道有這個函數及其功能就可以了,然後有用的時候,具體參數查一下就可以了。
希望能幫到你

3. C語言中qsort函數怎麼用

qsort函數是編譯器函數庫自帶的快速排序函數。
qsort 的函數原型是:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
它的參數為: 1 待排序數組首地址
2 數組中待排序元素數量
3 各元素的佔用空間大小
4 指向函數的指針,用於確定排序的順序
它在使用的時候需要包含頭文件:stdlib.h
實例:
#include<stdio.h>
#include<stdlib.h>
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int main()
{
int *array;
int n;
scanf("%d",&n);
array=(int*)malloc(n*sizeof(int));
int i=0;
for(;i<n;i++)
{
scanf("%d",(array+i));
}
qsort(array,n,sizeof(int),comp);
for(i=0;i<n;i++)
{
printf("%d\t",array[i]);
}
return0;
}

4. c語言 qsort

排序方法有很多種,
選擇排序,冒泡排序,歸並排序,快速排序等。
看名字都知道快速排序
是目前公認的一種比較好的排序演算法(我沒聽書速度比這快的了,特殊場合例外),比選擇排序,冒泡排序都要快。這是因為他速度很快,所以系統也在庫里實現這個演算法,便於我們的使用。
這就是qsort。
qsort
要求提供一個
比較函數,是為了做到通用性更好一點。比如你不僅僅的是要排序一個數字而已,可能你要用來排序幾個數字
,比如有一個結構
struct
num
{
int
a;
int
b;
};
然後我有一個num
類型的數組,
num
dddd[100];
我想給
dddd這個數組排序,那怎麼辦?
我想讓
a
+b
最大的num元素排在數組的最前面,那又怎麼辦?
這都可以通過定義比較函數來做到的。
比較函數的作用就是給qsort指明
元素的大小是怎麼比較的。
像這樣的比較函數
inline
int
MyCmp(const
void*
a,
const
void*
b)
都是有兩個元素
作為參數,返回一個int
值,
如果
比較函數返回大於0,qsort就認為
a>b
,
如果比較函數返回等於0
qsort就認為a
和b
這兩個元素相等,返回小於零
qsort就認為
a<b

qsort
知道元素大小,就可以把大的放到前面去。
如果你的比較函數放回本來應該是1
的(a>b),你比較函數卻返回一個
-1
(小於零的)那麼qsort認為a<b
的,就把
b放到前面去,但實際上是a大於b的,所以就造成升降序的差別了。
同樣的道理,如果有一個
結構
strunt
人{
int
身高;
int
體重;
}
你想讓身高最小的人排在最前面,那麼你也要自己定義自己的比較函數

5. c語言,關於qsort的使用,如何將17-20行的冒泡排序用qsort排

試想一下,如果讓你自己設計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;
}
。。呵呵,啰嗦了點。希望對你有幫助
21 1
查看全部3個回答
周圍人還關注
超越輕卡
海外手游充值
c語言入門知識
c語言入門
變頻直驅
六間房熱舞
六間房直播間
如何學習

6. C語言中qsort函數能對一個字元串裡面的字元排序嗎(按照ascil碼),怎麼排,求解答

一個例子:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int cmp(const void *c1,const void *c2)

{

return *(char*)c1-*(char*)c2;

}

int main()

{

char str[]="helloworld";

printf("排序前:%s ",str);

qsort(str,strlen(str),sizeof(str[0]),cmp);

printf("排序後:%s ",str);

return 0;

}

7. 如何用C語言的qsort對二維數組排序

建議你這樣試試看:

先定義數組大小:

8. c語言里qsort()裡面的逗號分割開的字元或者數字都代表著什麼

qsort有四個參數
原型為

void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
參數: 1 待排序數組首地址
2 數組中待排序元素數量
3 各元素的佔用空間大小
4 指向函數的指針,用於確定排序的順序
這個函數可以兼容各種排序
最後一個是比較特別的一個參數 它是一個函數指針 如果你還沒學函數指針的話 那麼還是不要深究這個函數了

9. 關於c語言中qsort函數的用法

引自 http://hi..com/sysucs/blog/item/4f9962f422d2c2ddf2d385fd.html qsort,包含在stdlib.h頭文件里,函數一共四個參數,沒返回值.一個典型的qsort的寫法如下

qsort(s,n,sizeof(s[0]),cmp);

其中第一個參數是參與排序的數組名(或者也可以理解成開始排序的地址,因為可以寫&s[i]
這樣的表達式,這個問題下面有說明); 第二個參數是參與排序的元素個數; 第三個三數是
單個元素的大小,推薦使用sizeof(s[0])這樣的表達式,下面也有說明 :) ;第四個參數就是
很多人覺得非常困惑的比較函數啦,關於這個函數,還要說的比較麻煩...

我們來討論cmp這個比較函數(寫成cmp是我的個人喜好,你可以隨便寫成什麼,比如qcmp什麼
的).典型的cmp的定義是

int cmp(const void *a,const void *b);

返回值必須是int,兩個參數的類型必須都是const void *,那個a,b是我隨便寫的,個人喜好.
假設是對int排序的話,如果是升序,那麼就是如果a比b大返回一個正值,小則負值,相等返回
0,其他的依次類推,後面有例子來說明對不同的類型如何進行排序.

在函數體內要對a,b進行強制類型轉換後才能得到正確的返回值,不同的類型有不同的處理
方法.具體情況請參考後面的例子.

/*----------------------------------------------------------------------------*/

** 關於快排的一些小問題 **

1.快排是不穩定的,這個不穩定一個表現在其使用的時間是不確定的,最好情況(O(n))和最
壞情況(O(n^2))差距太大,我們一般說的O(nlog(n))都是指的是其平均時間.

2.快排是不穩定的,這個不穩定表現在如果相同的比較元素,可能順序不一樣,假設我們有
這樣一個序列,3,3,3,但是這三個3是有區別的,我們標記為3a,3b,3c,快排後的結果不一定
就是3a,3b,3c這樣的排列,所以在某些特定場合我們要用結構體來使其穩定(No.6的例子就
是說明這個問題的)

3.快排的比較函數的兩個參數必須都是const void *的,這個要特別注意,寫a和b只是我的
個人喜好,寫成cmp也只是我的個人喜好.推薦在cmp裡面重新定義兩個指針來強制類型轉換,
特別是在對結構體進行排序的時候

4.快排qsort的第三個參數,那個sizeof,推薦是使用sizeof(s[0])這樣,特別是對結構體,
往往自己定義2*sizeof(int)這樣的會出問題,用sizeof(s[0)既方便又保險

5.如果要對數組進行部分排序,比如對一個s[n]的數組排列其從s[i]開始的m個元素,只需要
在第一個和第二個參數上進行一些修改:qsort(&s[i],m,sizeof(s[i]),cmp);

/*----------------------------------------------------------------------------*/

** 標程,舉例說明 **

No.1.手工實現QuickSort
#include <stdio.h>

int a[100],n,temp;

void QuickSort(int h,int t)
{
if(h>=t) return;
int mid=(h+t)/2,i=h,j=t,x;
x=a[mid];
while(1)
{
while(a[i]<x) i++;
while(a[j]>x) j--;
if(i>=j) break;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
a[mid]=a[j];
a[j]=x;
QuickSort(h,j-1);
QuickSort(j+1,t);
return;
}

int main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
QuickSort(0,n-1);
for(i=0;i<n;i++) printf("%d ",a[i]);

return(0);
}

No.2.最常見的,對int數組排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int s[10000],n,i;

int cmp(const void *a, const void *b)
{
return(*(int *)a-*(int *)b);
}

int main()
{
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&s[i]);

qsort(s,n,sizeof(s[0]),cmp);

for(i=0;i<n;i++) printf("%d ",s[i]);

return(0);
}

No.3.對double型數組排序,原理同int

這里做個注釋,本來是因為要判斷如果a==b返回0的,但是嚴格來說,兩個double數是不可能相等的,只能說fabs(a-b)<1e-20之類的這樣來判斷,所以這里只返回了1和-1
#include <stdio.h>
#include <stdlib.h>

double s[1000];
int i,n;

int cmp(const void * a, const void * b)
{
return((*(double*)a-*(double*)b>0)?1:-1);
}

int main()
{
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%lf",&s[i]);

qsort(s,n,sizeof(s[0]),cmp);

for(i=0;i<n;i++) printf("%lf ",s[i]);

return(0);
}

No.4.對一個字元數組排序.原理同int
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char s[10000],i,n;

int cmp(const void *a,const void *b)
{
return(*(char *)a-*(char *)b);
}

int main()
{
scanf("%s",s);
n=strlen(s);
qsort(s,n,sizeof(s[0]),cmp);

printf("%s",s);
return(0);
}

No.5.對結構體排序

注釋一下.很多時候我們都會對結構體排序,比如校賽預選賽的那個櫻花,一般這個時候都在
cmp函數裡面先強制轉換了類型,不要在return裡面轉,我也說不清為什麼,但是這樣程序會
更清晰,並且絕對是沒錯的. 這里同樣請注意double返回0的問題

#include <stdio.h>
#include <stdlib.h>

struct node
{
double date1;
int no;
} s[100];

int i,n;

int cmp(const void *a,const void *b)
{
struct node *aa=(node *)a;
struct node *bb=(node *)b;
return(((aa->date1)>(bb->date1))?1:-1);
}

int main()
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
s[i].no=i+1;
scanf("%lf",&s[i].date1);
}
qsort(s,n,sizeof(s[0]),cmp);

for(i=0;i<n;i++) printf("%d %lf\n",s[i].no,s[i].date1);

return(0);
}

No.6.對結構體排序.加入no來使其穩定(即data值相等的情況下按原來的順序排)

#include <stdio.h>
#include <stdlib.h>

struct node
{
double date1;
int no;
} s[100];

int i,n;

int cmp(const void *a,const void *b)
{
struct node *aa=(node *)a;
struct node *bb=(node *)b;
if(aa->date1!=bb->date1)
return(((aa->date1)>(bb->date1))?1:-1);
else
return((aa->no)-(bb->no));
}

int main()
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
s[i].no=i+1;
scanf("%lf",&s[i].date1);
}
qsort(s,n,sizeof(s[0]),cmp);

for(i=0;i<n;i++) printf("%d %lf\n",s[i].no,s[i].date1);

return(0);
}

No.7.對字元串數組的排序(char s[][]型)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char s[100][100];
int i,n;

int cmp(const void *a,const void *b)
{
return(strcmp((char*)a,(char*)b));
}

int main()
{
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%s",s[i]);

qsort(s,n,sizeof(s[0]),cmp);

for(i=0;i<n;i++) printf("%s\n",s[i]);

return(0);
}

No.8.對字元串數組排序(char *s[]型)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *s[100];
int i,n;

int cmp(const void *a,const void *b)

{
return(strcmp(*(char**)a,*(char**)b));
}

int main()
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
s[i]=(char*)malloc(sizeof(char*));
scanf("%s",s[i]);
}

qsort(s,n,sizeof(s[0]),cmp);

for(i=0;i<n;i++) printf("%s\n",s[i]);

return(0);
}

10. C語言sort函數如何使用

C語言中沒有預置的sort函數。如果在C語言中,遇到有調用sort函數,就是自定義的一個函數,功能一般用於排序。

一、可以編寫自己的sort函數。

如下函數為將整型數組從小到大排序。

voidsort(int*a,intl)//a為數組地址,l為數組長度。

{

inti,j;

intv;

//排序主體

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;

}

}}

對於這樣的自定義sort函數,可以按照定義的規范來調用。

二、C語言有自有的qsort函數。

功 能: 使用快速排序常式進行排序

頭文件:stdlib.h

原型: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

參數:

1 待排序數組首地址

2 數組中待排序元素數量

3 各元素的佔用空間大小

4 指向函數的指針,用於確定排序的順序

這個函數必須要自己寫比較函數,即使要排序的元素是int,float一類的C語言基礎類型。

以下是qsort的一個例子:

#include<stdio.h>

#include<stdlib.h>

intcomp(constvoid*a,constvoid*b)//用來做比較的函數。

{

return*(int*)a-*(int*)b;

}

intmain()

{

inta[10]={2,4,1,5,5,3,7,4,1,5};//亂序的數組。

inti;

qsort(a,n,sizeof(int),comp);//調用qsort排序

for(i=0;i<10;i++)//輸出排序後的數組

{

printf("%d ",array[i]);

}

return0;

}

(10)c語言qsort擴展閱讀:

sort函數的用法(C++排序庫函數的調用)

對數組進行排序,在c++中有庫函數幫我們實現,這們就不需要我們自己來編程進行排序了。

(一)為什麼要用c++標准庫里的排序函數

Sort()函數是c++一種排序方法之一,學會了這種方法也打消我學習c++以來使用的冒泡排序和選擇排序所帶來的執行效率不高的問題!因為它使用的排序方法是類似於快排的方法,時間復雜度為n*log2(n),執行效率較高!

(二)c++標准庫里的排序函數的使用方法

I)Sort函數包含在頭文件為#include<algorithm>的c++標准庫中,調用標准庫里的排序方法可以不必知道其內部是如何實現的,只要出現我們想要的結果即可!

II)Sort函數有三個參數:

(1)第一個是要排序的數組的起始地址。

(2)第二個是結束的地址(最後一位要排序的地址的下一地址)

(3)第三個參數是排序的方法,可以是從大到小也可是從小到大,還可以不寫第三個參數,此時默認的排序方法是從小到大排序。

Sort函數使用模板:

Sort(start,end,排序方法)

下面就具體使用sort()函數結合對數組里的十個數進行排序做一個說明!

例一:sort函數沒有第三個參數,實現的是從小到大

#include<iostream>

#include<algorithm>

using namespace std;

int main()

{

int a[10]={9,6,3,8,5,2,7,4,1,0};

for(int i=0;i<10;i++)

cout<<a[i]<<endl;

sort(a,a+11);

for(int i=0;i<10;i++)

cout<<a[i]<<endl;

return 0;

}

編譯器

GCC,GNU組織開發的開源免費的編譯器

MinGW,Windows操作系統下的GCC

Clang,開源的BSD協議的基於LLVM的編譯器

Visual C++:: cl.exe,Microsoft VC++自帶的編譯器

集成開發環境

CodeBlocks,開源免費的C/C++ IDE

CodeLite,開源、跨平台的C/C++集成開發環境

Orwell Dev-C++,可移植的C/C++IDE

C-Free

Light Table

Visual Studio系列

Hello World

熱點內容
基於nginx搭建圖片伺服器原理 發布:2025-02-07 07:44:18 瀏覽:448
java等待 發布:2025-02-07 07:28:24 瀏覽:611
vs編譯器會自己加空格嗎 發布:2025-02-07 07:23:05 瀏覽:174
光遇切換賬號安卓要輸入些什麼 發布:2025-02-07 07:10:20 瀏覽:501
多角線演算法 發布:2025-02-07 07:08:56 瀏覽:273
有效提高ftp傳輸速度 發布:2025-02-07 07:06:47 瀏覽:703
寒靈之劍腳本 發布:2025-02-07 06:57:12 瀏覽:119
解壓的窗口 發布:2025-02-07 06:44:34 瀏覽:798
android身份證 發布:2025-02-07 06:36:43 瀏覽:431
python的庫在哪 發布:2025-02-07 06:30:24 瀏覽:349