方法一:只能实现整形排序(冒泡排序)
#include<stdio.h>
void bubble_sort(int arr[], int sz){
int i=0;
for(i=0;i<sz-1;i++){
int flag = 0;
int j=0;
for(j=0;j<sz-1-i;j++){
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
flag = 1;
}
}
if(flag == 0)
break ;
}
}
int main(){
int arr[] = {2,1,3,4,5,6,7,8,9,0};
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
int i=0;
for(i=0;i<sz;i++){
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
方法二; 使用qsort()函数(全称quicksort)快速排序
头文件:#include<stdlib.h>
void qsort(
void *base,
size_t nmemb,
size_t size,
int (*compar)(const void *, const void *)
);
/*
函数功能:qsort()函数的功能是对数组进行排序
参数base - base指向数组的起始地址,通常该位置传入的是一个数组名
参数nmemb - nmemb表示该数组的元素个数
参数size - size表示该数组中每个元素的大小(字节数)
参数int (*compar)(const void* e1 , const void* e2) - 此为指向比较函数的函数指针,决定了排序的顺序。
第一个参数: 待排序数组的首元素地址
第二个参数:待排序数组的元素个数
第三个参数:待排序数组的每个元素的大小--单位是字节
第四个参数:是函数,比较两个元素中所用函数的地址,这个函数使用者自己来实现 (这个函数中的两个参数是待比较的两个元素的地址)
函数返回值:无
注意:如果两个元素的值是相同的,那么它们的前后顺序是不确定的。也就是说qsort()是一个不稳定的排序算法。
compar参数
compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型
如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的前面
如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定
如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的后面
这里得到的是升序排序
修改compar(),就可以使qsort()为降序排序
只要将上面compare()中的
return ( *(int*)e1 - *(int*)e2 );
改为:
return ( *(int*)e2 - *(int*)e1 );
*/
使用qsort排序整形
#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2){
return *(int*)e1 - *(int*)e2 ; // 升序,
//return *(int*)e2 - *(int*)e1 ; 降序
}
void test_int(){
int arr[] = {1,3,5,7,9,2,4,6,8,0};
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr,sz,sizeof(arr[0]),cmp_int);
int i=0;
for(i=0;i<sz;i++){
printf("%d ",arr[i]);
}
printf("\n");
}
int main(){
test_int();
return 0;
}
使用qsort排序浮点型
#include<stdio.h>
#include<stdlib.h>
int cmp_float(const void* e1, const void* e2){
return ((int)(*(float*)e1 - *(float*)e2));
// if( *(float*)e1 == *(float*)e2 )
// return 0;
// else if(*(float*)e1 > *(float*)e2)
// return 1;
// else
// return -1;
}
void test_float(){
float farr[] = {1.0, 8.0, 3.0, 5.0, 6.0};
int sz = sizeof(farr) / sizeof(farr[0]);
qsort(farr,sz,sizeof(farr[0]), cmp_float);
int i=0;
for(i=0;i<sz;i++){
printf("%f ",farr[i]);
}
printf("\n");
}
int main(){
test_float();
return 0;
}
使用qsort排序字符串
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
int cmp_string(const void* e1, const void* e2){
assert(e1 !=NULL && e2); //使用assert()函数断言,表达式为真,则不执行
return strcmp( *(char**)e1 , *(char**)e2); // 强制转换为二级指针,数组里面存储的是char*
}
void test_string(){
char *pch[] = {"my world","love","you"}; //pch是数组,元素个数未定义,元素的类型是char*
int sz = sizeof(pch) / sizeof(pch[0]);
qsort(pch,sz,sizeof(pch[0]),cmp_string);
int i=0;
for(i=0;i<sz;i++){
printf("%s ",pch[i] );
}
printf("\n");
}
int main(){
test_string();
return 0;
}
使用qsort排序结构体数组
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Stu{
char name[100];
int age;
};
int cmp_age(const void* e1, const void* e2){
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age; // 箭头的优先级比强制类型转换高,所有要加大括号
}
void test_age(){
struct Stu s[4] = {{"xiaochen",20}, {"wangwu",19}, {"xiaoli",18}, {"xiaojiang",17} };
int sz = sizeof(s) / sizeof(s[0]) ;
qsort(s,sz,sizeof(s[0]),cmp_age);
int i=0;
for(i=0;i<sz;i++){
printf("%s %d ",s[i].name , s[i].age);
}
printf("\n");
}
int cmp_name(const void* e1, const void* e2){
return strcmp( ((struct Stu*)e1)->name , ((struct Stu*)e2)->name );// 强制结构体指针
}
void test_name(){
struct Stu s[4] = {{"xiaochen",20}, {"wangwu",19}, {"xiaoli",18}, {"xiaojiang",17} };
int sz = sizeof(s) / sizeof(s[0]) ;
qsort(s,sz,sizeof(s[0]),cmp_name);
int i=0;
for(i=0;i<sz;i++){
printf("%s %d ",s[i].name , s[i].age); // 结构体的循环打印
}
printf("\n");
}
int main(){
test_age();
test_name();
return 0;
}