tft每日頭條

 > 生活

 > c語言任意排序法

c語言任意排序法

生活 更新时间:2024-12-29 20:06:09

c語言任意排序法?文章目錄1有關qsort2,具體形式3、實例說明4、C 中sort用法以及和c中qsort的區别,我來為大家科普一下關于c語言任意排序法?以下内容希望對你有幫助!

c語言任意排序法(CC快速排序)1

c語言任意排序法

文章目錄1有關qsort2,具體形式3、實例說明4、C 中sort用法以及和c中qsort的區别

1有關qsort

排序方法有很多種:選擇排序,冒泡排序,歸并排序,快速排序等。 看名字都知道快速排序是目前公認的一種比較好的排序算法。因為它速度很快,所以系統也在庫裡實現這個算法,便于我們的使用。 這就是qsort函數(全稱quicksort)。它是ANSI C标準中提供的,其聲明在stdlib.h文件中,是根據二分法寫的,其時間複雜度為n*log(n)

qsort函數聲明如下:

void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *));

參數說明:

1 .base,要排序的數組

2、nmemb,數組中元素的數目

3、size,每個數組元素占用的内存空間,可使用sizeof函數獲得

4、compar,指向函數的指針也即函數指針。這個函數用來比較兩個數組元素,第一個參數大于,等于,小于第二個參數時,分别顯示正值,零,負值。

qsort要求提供一個自己定義的比較函數。比較函數使得qsort通用性更好,有了比較函數qsort可以實現對數組、字符串、結構體等結構進行升序或降序排序。

  如比較函數 int cmp(const void *a, const void *b) 中有兩個元素作為參數(參數的格式不能變),返回一個int值,比較函數cmp的作用就是給qsort指明元素的大小是怎麼比較的。

2,具體形式

一,對int型數組排序

int num[100];

int cmp_int(const void* _a , const void* _b)  //參數格式固定

{

int* a = (int*)_a; //強制類型轉換

int* b = (int*)_b;

return *a - *b;  

}

qsort(num,100,sizeof(num[0]),cmp_int);

12345678910

二,對字符型數組排序

char word[100];

int cmp_char(const void* _a , const void* _b)  //參數格式固定

{

char* a = (char*)_a; //強制類型轉換

char* b = (char*)_b;

return *a - *b;  

}

qsort(word,100,sizeof(word[0]),cmp_cha

12345678910

三,對double型數組排序

double in[100];

int cmp_double(const void* _a , const void* _b)  //參數格式固定

{

double* a = (double*)_a; //強制類型轉換

double* b = (double*)_b;

return *a > *b ? 1 : -1;  //特别注意

}

qsort(in,100,sizeof(in[0]),cmp_doub

12345678910

在對浮點或者double型的一定要用三目運算符,因為要是使用像整型那樣相減的話,如果是兩個很接近的數則可能返回一個很小的小數(大于-1,小于1),而cmp的返回值是int型,因此會将這個小數返回0,系統認為是相等,失去了本來存在的大小關系

四、對字符串數組排序

char word[100][10];

int cmp_string(const void* _a , const void* _b)  //參數格式固定

{

char* a = (char*)_a;  //強制類型轉換

char* b = (char*)_b;

return strcmp(a,b);

}

qsort(word,100,sizeof(word[0]),cmp_string);

3、實例說明

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#include<string.h>

void main(void)

{

int i;

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

char b[10]={'a','b','c','d','e','f','g','h','i','j'};

double c[10]={0.1,0.2,0.9,0.5,0.3,0.6,0.7,0.8,1.1,1.2};

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

{

return (*(int*)a-*(int*)b);//a>b 返回正值

}

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

{

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

}

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

{

if(fabs(*(double*)a-*(double *)b)<1*exp(-20))

return 0;

else

return(((*(double*)a-*(double*)b)>0)?1:-1);

}

qsort(a,10,sizeof(int),&cmp1);//對于函數指針(指向函數的指針),直接傳入函數名或&函數名進行

//運算都是可以的,因為在調用函數時也是取的函數的地址

qsort(b,10,sizeof(char),cmp2);

qsort(c,10,sizeof(double),cmp3);

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

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

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

printf("%c ",b[i]);

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

printf("%lf ",c[i]);

}

4、C 中sort用法以及和c中qsort的區别

1、整形數據比較

bool cmp(int a,int b){

return a < b;

}

int a[10];

sort(a,a 10,cmp);

12345

2.實型數據比較

bool cmp(float a,float b){

return a < b;

}

int a[10];

sort(a,a 10,cmp);

12345

3,結構體類型比較

題目:有N個學生的數據,将學生數據按成績高低排序,如果成績相同則按姓名字符的字母序排序,如果姓名的字母序也相同則按照學生的年齡排序,并輸出N個學生排序後的信息。

struct student

{

int grade;

char name[101];

int age;

}stu[1001];

bool cmp(student a,student b)

{

int t = strcmp(a.name,b.name);

if(a.grade != b.grade)

return a.grade < b.grade;

else if(t != 0)

return t < 0;

else

return a.age < b.age;

}

sort(stu,stu n,cmp);

1234567891011121314151617181920

關于cmp函數參數中的&符号(轉) 關于sort函數中的cmp函數有着不同的寫法,以剛剛的整形元素比較為例

還有人是這麼寫的:

bool cmp(const int &a, const int &b){

return a>b;

}

int a[10];

sort(a,a 10,cmp);

思考:int 和const int&有什麼區别呢?

原來:作為函數參數:int這種寫法是值傳遞,const int&則是引用傳遞。 “值傳遞”——由于函數将自動産生臨時變量用于複制該參數,效率較低。 “引用傳遞”僅借用一下參數的别名而已,不需要産生臨時對象。效率較高。 tips:“引用傳遞”有可能改變參數,const修飾可以解決這個問題。

想學習更多C/C 編程知識,可以加入C/C 學習交流群:587250700

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved