任意类型排序

模拟qsort()函数,实现任意类型排序:

qsort()简介:

原型:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 )

base:要排序的的数组的首地址


num:要排序的元素的个数


width:元素所占的字节数


compare:函数指针,指向排序方式这个函数的指针。其中比较方式这个函数需要用户根据自己的需要


使用qsort要调用<stdlib.h>。


实现:

#include<stdio.h>
#include<stdlib.h>
int compare(const void *elem1, const void *elem2)   //比较方式
{
	const int *str1 = (const int *)elem1;
	const int *str2 = (const int *)elem2;
	return *str1>*str2;                         //">"升序,“<"降序
}
void sort(void *base, size_t num,size_t byte, int(*cmp)(const void *elem1, const *elem2))
{
	char *str = (char *)base;
	int flag = 0;
	const void *p1;
	const void *p2;
	for (size_t i = 0; i < num - 1; i++)
	{
		flag = 0;
		for (size_t j = 0; j < num - 1 - i; j++)
		{
	           p1 =(const void *)(str+(j*byte));
	           p2 = (const void *)(str+(j + 1)*byte);
	           if (cmp(p1,p2))
		   {
		      for (size_t k = 0; k < byte; k++)           //按字节交换
		      {
			str[j*byte + k] = str[j*byte + k] + str[(j + 1)*byte + k];
			str[(j+1)*byte + k] = str[j*byte + k] - str[(j + 1)*byte + k];
			str[j*byte + k] = str[j*byte + k]-str[(j + 1)*byte + k];
		      }
		      flag = 1;
		}
	}
	if (!flag)
	break;
	}
}
int main()
{
	int(*cmp)(const void *elem1, const *elem2)=compare;
	int arr[4] = { 20,40,5, 4 };
	sort(arr,4,4, cmp);
	for (int i = 0; i < 4; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}
时间: 2024-10-10 10:23:52

任意类型排序的相关文章

sql 可按任意字段排序的分页存储过程

最近做一个项目,其中有许多部分需要用到分页功能 并且这些需要分页的地方有一个共同的特点,那就是,分页,但并不是按ID(主键)来排序,而是要求按其他有重复值的列进行排序,比如,其中有一个页面,要列出将近1万条客户记录,要求按客户付费金额进行排序,这种情况,如果使用网上流行的通用分页存储过程是行不能的,比如,像下面的分页存储过程虽然很棒,可是,用在这里的话,就无计可施:(这个存储过程是我在CSDN上看到一位前辈高人写的) CREATE PROCEDURE GetRecordFromPage @tbl

runtime 任意类型 model 数据库方便存储

//这里边直接上代码 之后我在慢慢地讲解  之后我的QQ:378254160 我有DEMO 方便你们的使用联系我备注 runtime+数据库+任意model类型  当然有时候也是有局限的 //DataBasehandle.m #import "DataBasehandle.h" #import <objc/runtime.h> #import <sqlite3.h> //http://www.sjsjw.com/kf_mobile/article/4_17043

谓松散类型就是指当一个变量被申明出来就可以保存任意类型的

量为松散类型,所谓松散类型就是指当一个变量被申明出来就可以保存任意类型的值,就是不像SQL一样申明某个键值为int就只能保存整型数值,申明varchar只能保存字符串.一个变量所保存值的类型也可以改变,这在JavaScript中是完全有效的,只是不推荐.相比较于将变量理 http://www.djob.com/job_8EED14ACE3DE31D0.htmlhttp://www.djob.com/job_59C4A0258B1285F2.htmlhttp://www.djob.com/job_

MySQL类型转换 使用CAST将varchar转换成int类型排序

mysql为我们提供了两个类型转换函数:CAST和CONVERT,现成的东西我们怎能放过? 1 BINARY[(N)] 2 CHAR[(N)] 3 DATE 4 DATETIME 5 DECIMAL 6 SIGNED [INTEGER] 7 TIME 8 UNSIGNED [INTEGER] 例子: --使用CAST将varchar转换成int类型排序 select server_id from cardserver where game_id = 1 order by CAST(server_

C# 任意类型数据转JSON格式

每天都是不一样,积极的去感受生活 C# 任意类型数据转JSON格式 /// <summary> /// List转成json /// </summary> /// <typeparam name="T"></typeparam> /// <param name="jsonName"></param> /// <param name="list"></para

Java使用JDBC连接任意类型数据库(mysql oracle。。)

package cn.liz.test; import java.io.InputStream; import java.sql.Connection; import java.sql.Driver; import java.sql.SQLException; import java.util.Properties; import org.junit.Test; public class JBDCtest { /** * 编写一个通用的方法, 在不修改源程序的情况下, 可以获取任何数据库的连接

是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时

这里所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象.当对不存在继承关系的对象进行强制类型转换时,java 运行时将抛出 java.lang.ClassCastException 异常.在继承链中,我们将子类向父类转换称为“向上转型”,将父类向子类转换称为“向下转型”.很多时候,我们会... Coda 发布于 2015-04-12 14:09 评论(1)阅读(72) 1 http://www.djob.com/job_8EED14ACE3DE31D0.htmlhttp://www.

boost.any实现任意类型存储

当你需要一个可变的类型时,有三种可能的解决方案: 无限制的类型,如 void*. 这种方法不可能是类型安全的,应该象逃避灾难一样避免它. 可变的类型,即支持多种类型的存储和获取的类型. 支持转换的类型,如字符串类型与整数类型之间的转换. Any实现了第二种方案,一个基于值的可变化的类型,无限可能的类型.这个库通常用于把不同类型的东西存储到标准库的容器中. Any 库如何改进你的程序 任意类型的类型安全存储以及安全的取回 在标准库容器中存放不同类型的方法 可以在无须知道类型的情况下传送类型 Any

1.实参和形参的关系 2.函数的参数可以是任意类型吗? 3.函数作用域的问题

1.实参和形参的关系 参数:定义函数的时候,小括号中的变量就是参数叫形参,在执行函数的时候小括号中的参数叫实参.实参可带可不带,带了就相当于给形参赋值,没带就是undefined.但是可以不带的实参,在定义函数的时候跟他对应的形参必须放在后面形参的个数可以大于实参的个数,反过来不行. 2.函数的参数可以是任意类型吗? 函数的参数可以是任意类型 3.函数作用域的问题 函数内部声明的变量都是私有变量.私有变量存到私有空间去.什么是私有变量函数中带var和function声明定义的变量是私有变量.函数