qsort函数、sort函数【转】
http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/
先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的。
首先说一下, qsort
qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定)。集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决排序这个问题。所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分。
int num[];
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b; //升序排序
//return *(int *)b - *(int *)a; //降序排序
/*可见:参数列表是两个空指针,现在他要去指向你的数组元素。所以转型为你当前的类型,然后取值。
升序排列时,若第一个参数指针指向的“值”大于第二个参数指针指向的“值”,则返回正;若第一个参数指针指向的“值”等于第二个参数指针指向的“值”,则返回零;若第一个参数指针指向的“值”小于第二个参数指针指向的“值”,则返回负。
降序排列时,则刚好相反。
*/
}
调用样式:
qsort(s,n,sizeof(s[]),cmp);
示例完整函数(已在 VC6.0上运行通过):
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int s[],n,i;
int cmp(const void *a,const void *b)
{
return(*(int *)b-*(int *)a); //实现的是升序排序
}
int main()
{
// 输入想要输入的数的个数
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%d",&s[i]);
qsort(s,n,sizeof(s[]),cmp);
for(i=;i<n;i++)
printf("%d ",s[i]);
return();
}
二、对char类型数组排序(同int类型)
char word[];
int cmp( const void *a , const void *b )
{
//注意,网上很多版本是 “ return *(char *)a - *(int *)b; ”
//因为编辑者的不用心,盲目copy,以讹传讹,传的一直是错的 *(int *)b
//应该是return *(char *)a - *(char *)b;
return *(char *)a - *(char *)b;
}
调用格式:
qsort(word,,sizeof(word[]),cmp);
//附,可能 getchar(); 会派上用场
double in[];
int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? : -;
//返回值的问题,显然cmp返回的是一个整型,所以避免double返回小数而被丢失,用一个判断返回值。
}
调用格式:
struct In
{
double data;
int other;
}s[]
//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写
int cmp( const void *a ,const void *b)
{
return (*(In *)a).data > (*(In *)b).data ? : -;
//注意,这条语句在VC6.0环境下运行可能会出错,但是并不是语句错了,而是你要先 Build ,或者全部重建。总之语句是对的。
//或者你可以将这上面1条语句改成下面这3条语句
//struct In *aa = (In *)a;
//struct In *bb = (In *)b;
//return aa->data > bb->data ? 1 : -1;
}
struct In
{
int x; //你可以比喻成:失败次数
int y; //你可以比喻成:成功次数
}s[];
//按照x从小到大排序,当x相等时按照y从大到小排序。 你可以想象成:失败是主要因素的一个问题,先比较 失败次数少,失败次数相同 再看 成功次数多。
int cmp( const void *a , const void *b )
{
struct In *c = (In *)a;
struct In *d = (In *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),cmp);
struct In
{
int data;
char str[];
}s[];
//按照结构体中字符串str的字典顺序排序
int cmp ( const void *a , const void *b )
{
return strcmp( (*(In *)a)->str , (*(In *)b)->str );
}
qsort(s,100,sizeof(s[0]),cmp);
再说说 sort (常用于 C++ )
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[];
for(int i=;i<;++i)
cin>>a[i]; sort(a,a+); //范围,很明显这里是a+20 注意,这是必要的,如果是a+19
for(i=;i<;i++) //最后一个值a[19]就不会参与排序。
cout<<a[i]<<endl;
return ;
}
std::sort是一个改进版的qsort. std::sort函数优于qsort的一些特点:对大数组采取9项取样,更完全的三路划分算法,更细致的对不同数组大小采用不同方法排序。
最后,我们来说说sort、qsort的区别:
#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
if(a<b)
return ; //升序排列,如果改为 a >b,则为降序,要注意sort()中cmp()的返值只有1和0,不像qsort中存在-1!!!!
else
return ;
} int main()
{
int i;
int a[];
for(int i=;i<;++i)
cin>>a[i];
sort(a,a+,cmp); //范围,很明显这里是a+5 注意,这是必要的,如果是a+4最后一个值a[4]就不会参与排序。
for(i=;i<;i++)
cout<<a[i]<<endl;
system("pause");
return ;
}
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
bool cmp(int *p,int *q)
{
if(p[]==q[])
{
if(p[]==q[])
{
return p[]<q[];
}
else return p[]<q[];
}
else return p[]<q[];
}
int main()
{
srand(time());
int i;
int **a=new int*[];
for(i=;i<;++i)
{
a[i]=new int[];
a[i][]=rand()%;
a[i][]=rand()%;
a[i][]=rand()%;
//printf("%d\t%d\t%d\n",a[i][0],a[i][1],a[i][2]);
}
sort(a,a+,cmp);
/*cout<<"After sort"<<endl;
for(i=0;i<1000;++i)
{
printf("%d\t%d\t%d\n",a[i][0],a[i][1],a[i][2]);
}*/
return ;
}
qsort函数、sort函数【转】的更多相关文章
- FCL源码中数组类型的学习及排序函数Sort函数的分析
Array 是所有数组的基类ArrayList 解决了所有Array 类的缺点 能动态扩容, 但是类型不安全的,而是会有装箱与拆箱的性能开销List<T> 则是解决了ArrayLis ...
- (C++)STL排序函数sort和qsort的用法与区别
主要内容: 1.qsort的用法 2.sort的用法 3.qsort和sort的区别 qsort的用法: 原 型: void qsort(void *base, int nelem, int widt ...
- qsort函数、sort函数 (精心整理篇)
先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有 ...
- qsort函数、sort函数
先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有 ...
- python:数组/列表(remove()函数、append()函数、sort()函数、reverse()函数)
排序: 1:整理顺序 #冒泡 lista = [5,7,11,19,99,63,3,9,1] list = [] while lista != []: number = 0 for i in list ...
- python下使用sort()函数对目录下文件名进行多条件排序
目录 1.基础函数 2.例子解析 参考 1.基础函数 a.sort()函数 sort()函数的作用是对列表内容进行正向排序,直接在原列表进行修改,返回的是修改后的列表. lists =[1, 5, 1 ...
- qsort与sort
快排是我们平常敲代码和比赛的时候 经常使用到的方法 qsort是函数库中自带的函数 这是一个标准的快排函数 而sort比qsort更是好用 sort对于不同大小的数组 会使用不 ...
- C中的qsort函数和C++中的sort函数的理解与使用
一.qsort()函数 原型:_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*)); ...
- C++ 排序函数 sort(),qsort()的用法
转自:http://blog.csdn.net/zzzmmmkkk/article/details/4266888/ 所以自己总结了一下,首先看sort函数见下表: 函数名 功能描述 sort 对给定 ...
随机推荐
- DataTable的子查询--DataTable.Select()
由于需要,在sql查询获得结果集之后,又需要对该结果再进行筛选一次,若重新从sql中查询会浪费资源,因此特地去查阅了一些资料,学会了用DataTable进行子查询. 在.Net Framework 2 ...
- 堆排序C++实现
/* * heapsort.cpp * * Created on: 2016年3月30日 * Author: Lv_Lang */ //堆排序 #include <iostream> us ...
- How can I protect derived classes from breaking when I change the internal parts of the base class?
How can I protect derived classes from breaking when I change the internal parts of the base class? ...
- Caliburn.Micro学习笔记目录——Zhouyongh
解析Caliburn.Micro(一) 解析Caliburn.Micro(二) 解析Caliburn.Micro(三) 解析Caliburn.Micro(四) Illusion = Caliburn. ...
- macbook air 128g 磁盘清理
使用 du 命令发现 ~/Library/Developer/Xcode/DerivedData 占用了大量空间,这些都是xcode对以前建过的project源码文件建立的索引等,如果不需要可以都删 ...
- REVERSE-DAILY(5)-rev2
比较有意思的一道题目 提示是一个迷宫 链接: http://pan.baidu.com/s/1pLhINBt 密码:91bs 先运行程序,要求是输入字符串,错误会输出"Sorry you ...
- 炫酷的Linux终端命令大全-1
1. 命令行日常快捷键. CTRL + U ------------------------------- 剪切光标前的内容 CTRL + K ----- ...
- rand & random & arc4random
rand(3) / random(3) / arc4random(3) / et al. Written by Mattt Thompson on August 12th, 2013 What pas ...
- 数据库和3G的结合使用
// // 设备数据管理类 #import <Foundation/Foundation.h> #import "DeviceInfo.h" @interface D ...
- Android模拟器Genymotion如何访问本地服务器?
Genymotion能否访问到本地服务器,其实与Genymotion本身并无太大关系.Genymotion作为VirtualBox中的一个虚拟OS运行,所以它访问网络的方式与其他VirtualBox中 ...