用C语言实现整形,浮点型,字符串,结构体的排序

方法一:只能实现整形排序(冒泡排序)

       

#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;    
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值