qsort 排序功能 总结

qsort包括在<stdlib.h>头文件里。此函数依据你给的比較条件进行高速排序,通过指针移动实现排序。

排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比較函数。

函数原型:

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

使用方法以及參数说明:

Sorts the num elements of the array pointed by base, each element size bytes

long, using the comparator function to determine the order.

The sorting algorithm used by this function compares pairs of values by calling the specified comparator function with two pointers to elements
of the array.

The function does not return any value, but modifies the content of the array pointed by base reordering its elements to the newly sorted order.

base Pointer to the first element of the array to be sorted.(数组起始地址)

num Number of elements in the array pointed by base.(数组元素个数)

size Size in bytes of each element in the array.(每个元素的大小)

comparator Function that compares two elements.(函数指针。指向比較函数)

1、The function must accept two parameters that are pointers to elements, type-casted as void*. These parameters should be cast back to some data type and be compared.

2、The return value of this function should represent whether elem1 is considered less than, equal to, or greater than elem2 by returning, respectively, a negative value, zero or a positive value.

Return Value none (无返回值)

>>>1. 对整形数据进行排序:(从小到大)

int Num[1010];

qsort(Num, n, sizeof(int), cmp);

int cmp(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}

从大到小:

int cmp(const void *a, const void *b)
{
    return *(int *)b - *(int *)a;
}

>>>2. 对char數據進行排序:

char str[1010];

qsort(str, sizeof(str), sizeof(char), cmp);

int cmp(const void *a, const void *b)
{
    return *(int *)a - *(int *)b;
}

>>>3. 對double數據進行排序:

double Num[1010];

qsort(Num, n, sizeof(double), cmp);

int cmp(const void *a, const void *b)
{
    return *(double *)a > *(double *)b ?

1 : -1;
}

>>>4. 對結構體數據進行排序:

typedef struct Node_
{
    int data;
    int position;
}Node;

Node Num[1010];

qsort(Node, n, sizeof(Node), cmp);

int cmp(const void *a, const void *b)
{
    Node *p1 = (Node *)a;
    Node *p2 = (Node *)b;
    if(p1->data != p2->data) return p1->data - p2->data;
    else return p1->position - p2->position;
}

實例:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define MAXN 1010
#define RST(N)memset(N, 0, sizeof(N))
using namespace std;

typedef struct Node_
{
    char name[MAXN];
    int data;
    int position;
}Node;

Node N[MAXN];

int cmp(const void *a, const void *b) //先對data進行從大到小,position和name從小到大排序
{
    Node *p1 = (Node *)a;
    Node *p2 = (Node *)b;
    if(p1->data != p2->data) return p2->data - p1->data;
    else if(p1->position != p2->position) {
        return p1->position - p2->position;
    }else return strcmp(p1->name, p2->name);
}

int main()
{
    int n;
    while(~scanf("%d", &n)) {
        for(int i=0; i<n; i++) {
            scanf("%s %d %d", N[i].name, &N[i].data);
            N[i].position = i;
        }
        qsort(N, n, sizeof(Node), cmp);
        printf("------------------------------------\n");
        for(int i=0; i<n; i++) {
            printf("%s %d %d\n", N[i].name, N[i].data, N[i].position);
        }
    }
    return 0;
}
时间: 2024-12-15 03:26:32

qsort 排序功能 总结的相关文章

用qsort排序

 冒泡,快排都是常见的排序方法,这里介绍用头文件中的qsort函数排序.不过自己要先一个cmp函数. #include<stdlib.h>//qsort的头文件 int a[100]={0,2,4,1,5,7,3,8,9}; //要排序的数组 struct Person//要排序的结构体 { char num[20]; char name[100]; int score; int sum; }man[100]; 1.给数组a[]排序 int cmp_1(const void *a,cons

MYSQL-实现ORACLE 和SQLserver数据中- row_number() over(partition by ) 分组排序功能

网上看见了好多例子都基本上是一样的,没有过多的解释,对于一个初学MySQL来说有点难,我把部分转摘过来如下 原文:http://www.cnblogs.com/buro79xxd/archive/2012/08/29/2662489.html 要求目标:1.确定需求: 根据部门来分组,显示各员工在部门里按薪水排名名次. 创建表格:2.来创建实例数据: drop table if exists heyf_t10; create table heyf_t10 (empid int ,deptid i

MapReduce实现排序功能

期间遇到了无法转value的值为int型,我采用try catch解决 str2 2 str1 1 str3 3 str1 4 str4 7 str2 5 str3 9 用的\t隔开,得到结果 str1 1,4 str2 2,5 str3 3,9 str4 7 我这里map,reduce都是单独出来的类,用了自定义的key package com.kane.mr; import java.io.DataInput; import java.io.DataOutput; import java.i

IOS UITableView拖动排序功能

UITbableView作为列表展示信息,除了展示的功能,有时还会用到删除,排序等功能,下面就来讲解一下如何实现排序. 排序是当表格进入编辑状态后,在单元格的右侧会出现一个按钮,点击按钮,就可以拖动单元格,移动位置,进行手动排序. 使用系统自带拖动排序功能的步骤: 1.让tableView进入编辑状态,也就是设置它的editing为YES 2.返回编辑模式,也就是实现UITableViewDelegate中的tableview:editingStyleForRowAtIndexPath:方法,在

qsort排序算法

七种qsort排序方法<本文中排序都是采用的从小到大排序>一.对int类型数组排序int num[100];Sample:int cmp ( const void *a , const void *b ){return *(int *)a - *(int *)b;}qsort(num,100,sizeof(num[0]),cmp);二.对char类型数组排序(同int类型)char word[100];Sample:int cmp( const void *a , const void *b 

怎样运用好MindMapper分类排序功能

我们可以在MindMapper中文版绘制导图过程中通过分类排序来对导图主题进行整理,而分类排序的条件也是多样化的,我们甚至还能够自定义排序条件.下面本文就教你怎样运用MindMapper分类排序功能. 若有疑问可直接访问:http://www.mindmapper.cc/jiqiao/mmp-fenlei-paixu.html 如何排序 1.选择所要排序的主题分支中最高等级主题.如果选择了中心主题,则整个对整个导图进行排序. 2.随后选择编辑中的排序选项图标. 3.选择一个条件,主题将按选定的条

最易理解的qsort排序算法

快速排序算法程序可以写得千奇百怪,但最易理解的个人认为仍是下面的: #include<stdio.h> #include<time.h> #include<stdlib.h> void swap(int *a ,int *b) { int t = *a; *a = *b; *b = t; } int partition(int array[],int l,int r) { int pivot = array[r]; int curpos = l; int j ; for

简单实现Redis缓存中的排序功能

1.在实现缓存排序功能之前,必须先明白这一功能的合理性.不妨思考一下,既然可以在数据库中排序,为什么还要把排序功能放在缓存中实现呢?这里简单总结了两个原因:首先,排序会增加数据库的负载,难以支撑高并发的应用:其次,在缓存中排序不会遇到表锁定的问题.Redis恰好提供了排序功能,使我们可以方便地实现缓存排序. 2. 应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql.3. 在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增

RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-&gt;Web版本模块管理界面新增模块排序功能

模块(菜单)的排序是每个系统都必须要有的功能,我们框架模块的排序在业务逻辑中已经体现. WinForm版本可以直接在界面上对模块进行排序以控制模块展示的顺序.Web版本在3.2版本中也新增了直接可以模块管理界面对模块进行排序的人性化操作,大大的方便了管理人员.模块的排序在模块管理主界面分页按钮的右侧如下图所示. 三个按钮功能分别为:上移.下移.确认修改 WebMVC部分,模块排序功能代码参考: /// <summary> /// 保存模块排序功能 /// </summary> //