zoukankan      html  css  js  c++  java
  • qsort函数的用法

    function
    <cstdlib>

    qsort

    void qsort (void* base, size_t num, size_t size,
                int (*compar)(const void*,const void*));
    各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针

    Sort elements of array

    Sorts the num elements of the array pointed to by base, each element size bytes long, using the compar function to determine the order.

    The sorting algorithm used by this function compares pairs of elements by calling the specified compar function with pointers to them as argument.

    The function does not return any value, but modifies the content of the array pointed to by base reordering its elements as defined by compar.

    The order of equivalent elements is undefined.

    Parameters

    base
    Pointer to the first object of the array to be sorted, converted to a void*.
    num
    Number of elements in the array pointed to by base.
    size_t is an unsigned integral type.
    size
    Size in bytes of each element in the array.
    size_t is an unsigned integral type.
    compar
    Pointer to a function that compares two elements.
    This function is called repeatedly by qsort to compare two elements. It shall follow the following prototype:
     
    int compar (const void* p1, const void* p2);
     

    Taking two pointers as arguments (both converted to const void*). The function defines the order of the elements by returning (in a stable and transitive manner):
    return value meaning
    <0 The element pointed to by p1 goes before the element pointed to by p2
    0 The element pointed to by p1 is equivalent to the element pointed to by p2
    >0 The element pointed to by p1 goes after the element pointed to by p2

    For types that can be compared using regular relational operators, a general compar function may look like:

    1
    2
    3
    4
    5
    6
    
    int compareMyType (const void * a, const void * b)
    {
      if ( *(MyType*)a <  *(MyType*)b ) return -1;
      if ( *(MyType*)a == *(MyType*)b ) return 0;
      if ( *(MyType*)a >  *(MyType*)b ) return 1;
    }
     


    Return Value

    none

    (本文默认采用从小到大排序)

    一、对int类型数组排序

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define N 10
    
    int cmp(const void *a, const void *b)
    {
    	return *((int*)a) - *((int*)b);
    }
    
    int main()
    {
    	srand((unsigned)time(NULL));
    	int num[100];
    	for (int i = 0; i < N; i++)
    	{
    		num[i] = rand() % 100;
    	}
    	puts("待排序数组:");
    	for (int i = 0; i < N; i++)
    	{
    		printf("%d ", num[i]);
    	}
    	putchar('
    ');
    	qsort(num, N, sizeof(num[0]), cmp);
    	puts("排序后:");
    	for (int i = 0; i < N; i++)
    	{
    		printf("%d ", num[i]);
    	}
    }

    二、对char类型数组排序(同int类型)

    三、对double类型数组排序

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define N 10
    
    int cmp(const void *a, const void *b)
    {
    	return *((double*)a) > *((double*)b) ? 1 : -1;
    }
    
    int main()
    {
    	srand((unsigned)time(NULL));
    	double num[100];
    	for (int i = 0; i < N; i++)
    	{
    		num[i] = rand() % 100 / 2.0;
    	}
    	puts("待排序数组:");
    	for (int i = 0; i < N; i++)
    	{
    		printf("%.1f ", num[i]);
    	}
    	putchar('
    ');
    	qsort(num, N, sizeof(num[0]), cmp);
    	puts("排序后:");
    	for (int i = 0; i < N; i++)
    	{
    		printf("%.1f ", num[i]);
    	}
    }

    四、对结构体一级排序

    (按照chinese的数值从小到大排序)
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define N 10
    
    typedef struct SCORE
    {
    	int chinese;
    	int math;
    	int english;
    }SCORE;
    
    int cmp(const void *a, const void *b)
    {
    	return ((SCORE*)a)->chinese - ((SCORE*)b)->chinese;
    }
    
    int main()
    {
    	srand((unsigned)time(NULL));
    	
    	SCORE scores[100];
    	for (int i = 0; i < N; i++)
    	{
    		scores[i].chinese = rand() % 100;
    		scores[i].math = rand() % 100;
    		scores[i].english = rand() % 100;
    	}
    	puts("待排序数据:");
    	for (int i = 0; i < N; i++)
    	{
    		printf("%d %d %d
    ", scores[i].chinese, scores[i].math, scores[i].english);
    	}
    	putchar('
    ');
    	qsort(scores, N, sizeof(SCORE), cmp);
    	puts("排序后:");
    	for (int i = 0; i < N; i++)
    	{
    		printf("%d %d %d
    ", scores[i].chinese, scores[i].math, scores[i].english);
    	}
    }


    五、对结构体二级排序

    (按照chinese从小到大排序,相同时按照math从小到大排序)
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define N 10
    
    typedef struct SCORE
    {
    	int chinese;
    	int math;
    	int english;
    }SCORE;
    
    int cmp(const void *a, const void *b)
    {
    	if (((SCORE*)a)->chinese != ((SCORE*)b)->chinese)
    	{
    		return ((SCORE*)a)->chinese - ((SCORE*)b)->chinese;
    	}
    	else
    	{
    		return ((SCORE*)a)->math - ((SCORE*)b)->math;
    	}
    }
    
    int main()
    {
    	srand((unsigned)time(NULL));
    	
    	SCORE scores[100];
    	for (int i = 0; i < N; i++)
    	{
    		scores[i].chinese = rand() % 100;
    		scores[i].math = rand() % 100;
    		scores[i].english = rand() % 100;
    	}
    	puts("待排序数据:");
    	for (int i = 0; i < N; i++)
    	{
    		printf("%d %d %d
    ", scores[i].chinese, scores[i].math, scores[i].english);
    	}
    	putchar('
    ');
    	qsort(scores, N, sizeof(SCORE), cmp);
    	puts("排序后:");
    	for (int i = 0; i < N; i++)
    	{
    		printf("%d %d %d
    ", scores[i].chinese, scores[i].math, scores[i].english);
    	}
    }


    六、对字符串进行排序

    (按照name字典序进行排序)
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 3
    
    typedef struct PERSON
    {
    	char name[20];
    	int age;
    }PERSON;
    
    int cmp(const void *a, const void *b)
    {
    	return strcmp(((PERSON*)a)->name, ((PERSON*)b)->name);
    }
    
    int main()
    {
    	
    	PERSON persons[N];
    	strcpy(persons[0].name, "aab");
    	persons[0].age = 10;
    	strcpy(persons[1].name, "abc");
    	persons[1].age = 11;
    	strcpy(persons[2].name, "aaa");
    	persons[2].age = 12;
    	puts("待排序数据:");
    	for (int i = 0; i < N; i++)
    	{
    		printf("%s %d
    ", persons[i].name, persons[i].age);
    	}
    	putchar('
    ');
    	qsort(persons, N, sizeof(PERSON), cmp);
    	puts("排序后:");
    	for (int i = 0; i < N; i++)
    	{
    		printf("%s %d
    ", persons[i].name, persons[i].age);
    	}
    }


    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    JAVA项目实战-设计模式-工厂模式的项目使用
    JAVA项目实战-设计模式——单例模式项目中运用
    JAVA项目实战-实现生成固定格式PDF文件和打包成zip压缩包并在浏览器中输出
    JAVA项目实战-阿里巴巴easyexcel导出导入工具使用
    JAVA项目实战-文件的上传和下载功能
    JAVA项目实战-生成二维码和验证码功能
    JAVA项目实战-高德地图API实现定位导航功能
    JAVA项目实战 -微信支付开发
    JAVA调用腾讯云API-实现语音合成(TTS)(三)
    MySQL高可用架构故障自动转移插件MHA
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5834709.html
Copyright © 2011-2022 走看看