C語言qosrt()函數的使用對二維數組的排序和多維數組的排序

qsort()

qosrt()這個函數很有作用,可以用來排列一維的數組,還可以排列二維的數組等高緯度的數組。除此之外,還可以排列一部分的數組元素,qsort第一個參數是數組名,第二個參數是數組的長度,第三個參數是數組成員的大小,第四個參數是比較器。

一維數組

整形的一維數組

先來一份小代碼

int cmp(const void *a, const void * b)
{
    int c = *(int *)a;
    int d = *(int *)b;
    return c - d;
}
int main()
{
    int i;
    int a[5] = {1,3,2,4,0};
    qsort(a,5, sizeof(int), cmp);
    for (i = 0; i < 5; i++)
        printf("%d ",a[i]);
}
結果
0 1 2 3 4

首先我們要理解cmp的含義,cmp是一個比較器,當我們cmp返回的是一個正數時,會進行交換,例如如果上述的代碼中變量c是3 d是2,c - d是大於0的,所以a[1]與a[2]進行交換。

靈活的運用

我們可以通過過改變起始位置和數組的長度來改變排列的範圍

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int cmp(const void *a, const void * b)
{
    int c = *(int *)a;
    int d = *(int *)b;
    return c - d;
}
int main()
{
    int i;
    int a[5] = {1,3,2,4,0};
    qsort(a+1,3, sizeof(int), cmp);
    //我們從a[1]開始,到a[4]結束,重點是不包括a[4]
    for (i = 0; i < 5; i++)
        printf("%d ",a[i]);
}
結果
1 2 3 4 0

一維的字符數組

對於排列一維的字符數組也是一樣的。因爲字符的運算本質是阿斯卡碼的運算。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int cmp(const void *a, const void * b)
{
    char c = *(char *)a;
    char d = *(char *)b;
    return c - d;
}
int main()
{
    int i;
    char a[5] = {'a','v','q','b','c'};
    qsort(a,5, sizeof(char), cmp);
    for (i = 0; i < 5; i++)
        printf("%c ",a[i]);
}

二維數組

整形的二維數組

先來一份小代碼

int cmp(const void *a, const void * b)
{
    int* c = *(int **)a;
    int* d = *(int **)b;
    return c[0] - d[0];//如果是第二個元素排序就是c[1]與d[1]l了
}
int main()
{
    int i, fi = 4;
    int** a = malloc(sizeof(int **) * 2);
    for(i = 0; i < 2; i++)
        a[i] = malloc(sizeof(int) * 2);
    for(i = 0; i < 2; i++)
    {
        a[i][0] = fi--;
        a[i][1] = fi--;
    }
    qsort(a,2, sizeof(int*), cmp);
    for (i = 0; i < 2; i++)
        printf("%d %d\n",a[i][0],a[1][1]);
}
結果
2 3
4 3

請注意這個直接開一個二維數組是,在使用qsort()有問題的原因不知道,知道的大佬可以說一下。這裏是通第一個元素從小到大的排序。

###字符的二維數組
來一份代碼

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<string.h>
int cmp(const void *a, const void * b)
{
    char* c = *(char **)a;
    char* d = *(char **)b;
    return strcmp(c,d);
}
int main()
{
    int i;
    char fi = 'z';
    char** a = malloc(sizeof(char **) * 2);
    for(i = 0; i < 2; i++)
        a[i] = malloc(sizeof(char) * 2);
    for(i = 0; i < 2; i++)
    {
        a[i][0] = fi--;
        a[i][1] = fi--;
    }
    qsort(a,2, sizeof(char*), cmp);
    for (i = 0; i < 2; i++)
        printf("%c %c\n",a[i][0],a[1][1]);
}

注意cmp在這cmp中,使用的是strcmp(),看可以通過它,進行字典序的排序,從而達到對二位數組的排序,strcmp詳細的用法可以百度一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章