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詳細的用法可以百度一下。