無論是多少維的數(shù)組,機(jī)內(nèi)都是一維的,以行優(yōu)先存放。所以直接降為一維數(shù)組排序最方便省事。下面以二維數(shù)組為例寫出代碼——
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站建設(shè)、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的黃龍網(wǎng)站設(shè)計(jì)、移動媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
#include?"stdio.h"
int?main(int?argc,char?*argv[]){
int?x[3][3]={{9,4,3},{6,2,7},{5,8,1}},i,j,k,*p;
printf("Before?ordering?is?as?follows:\n");
for(i=0;i3;i++){
for(j=0;j3;printf("%2d",x[i][j++]));
printf("\n");
}
for(p=(int?*)x,i=0;i9;i++){//用p=(int?*)x將x降為一維數(shù)組p,選擇法排序
for(k=i,j=k+1;j9;j++)
if(p[k]p[j])
k=j;
if(k!=i)
j=p[k],p[k]=p[i],p[i]=j;
}
printf("Sorted?as?follows:\n");
for(i=0;i3;i++){//輸出排序后的二維數(shù)組
for(j=0;j3;printf("%2d",x[i][j++]));
printf("\n");
}
return?0;
}
運(yùn)行結(jié)果:
#include?stdio.h
#include?string.h
#define?N?5??????????//定義符號常量
#define?MAX_LEN?100??//字符串最大長度
void?selectSort(char?(*pt)[MAX_LEN],int?n)??//形參pt為指向二維字符數(shù)組的指針
{
int?i,j,k;
char?tmp[MAX_LEN];??//臨時字符數(shù)組
for(i=0;in-1;i++)??//遍歷所有未排序的字符串的趟數(shù)
{
k=i;??//變量k存放當(dāng)前最小字符串的下標(biāo)
for(j=i+1;jn;j++)???????????????//遍歷下標(biāo)從(i+1)~(n-1)的所有字符串
if(strcmp(pt[k],pt[j])??0)??//字符串進(jìn)行兩兩大小比較,如果0,則執(zhí)行if語句體
k=j;?????????????????????//將當(dāng)前最小的字符串的數(shù)組下標(biāo)賦值給變量k
if(k?!=?i)???????????????????????//如果k不等于i,則執(zhí)行if語句體
{???//兩個字符串進(jìn)行交換操作
strcpy(tmp,pt[k]);
strcpy(pt[k],pt[i]);
strcpy(pt[i],tmp);
}
}
}
int?main()
{
char?str[N][MAX_LEN];??//定義二維字符數(shù)組
int?i;
printf("輸入字符串:\n");
for(i=0;iN;i++)
scanf("%s",str[i]);
selectSort(str,N);??//調(diào)用選擇排序函數(shù)
printf("輸出排序后的字符串:\n");
for(i=0;iN;i++)
printf("%s\n",str[i]);
return?0;
}
建議你這樣試試看:
先定義數(shù)組大?。?/p>
然后定義一個數(shù)組比較函數(shù):
注意事項(xiàng):
更安全的調(diào)用方式為qsort_s;
然后調(diào)用 qsort函數(shù)進(jìn)行排序,具體邏輯如下:
代碼合并如下:
這里只是根據(jù)你的數(shù)據(jù)生成了二維數(shù)組,可以根據(jù)你的具體情況進(jìn)行調(diào)整;另外,關(guān)于qsort函數(shù)的用法,參考:qsort
關(guān)于比較函數(shù)的返回值,這里有一個表:
最后,以上代碼的運(yùn)行結(jié)果如下:
在C語言中,二維數(shù)組按行存儲,對每一行排序很方便,可以把每一行當(dāng)成一個一維數(shù)組,使用排序函數(shù)直接進(jìn)行排序。
然而對每一列進(jìn)行排序,就不能直接當(dāng)成一維數(shù)組進(jìn)行排序。但是仍然可以把第j列a[0...M-1][j]在邏輯上當(dāng)成一維數(shù)組進(jìn)行排序,下面以使用冒泡排序?yàn)槔龑ζ渑判颉?/p>
對二維數(shù)組按列排序后,進(jìn)一步展示了如何調(diào)用快速排序函數(shù)按行進(jìn)行排序。
程序源碼:
#include stdio.h#include stdlib.h #define M 3#define N 3 //輸出二維數(shù)組的函數(shù)void print(int a[][N]){ int i,j; for(i=0;iM;i++) { for(j=0;jN;j++) { printf("%d ",a[i][j]); } printf("\n"); } } //qsort的cmp函數(shù)int cmp(const void*a, const void *b){ return *(int*)a-*(int*)b;} int main(int argc, char* argv){ int a[M][N]={3,2,1,9,8,7,6,5,4}; printf("按列排序前的二維數(shù)組是:\n"); print(a); printf("\n"); int j; for(j=0;jN;j++)//對每一列進(jìn)行升序排序 { //對第j列進(jìn)行排序 int m,n; int t; for(m=M-1;m0;m--) { for(n=0;nm;n++) { if(a[n][j]a[n+1][j]) { t=a[n][j]; a[n][j]=a[n+1][j]; a[n+1][j]=t; } } } } printf("按列排序后二維數(shù)組變?yōu)椋篭n"); print(a); printf("\n"); //對按列排序后的二維數(shù)組按行升序排序 (調(diào)用快速排序函數(shù)) int i; for(i=0;iM;i++) { qsort(a[i],N,sizeof(a[i][0]),cmp); } printf("按列排序后再按行排序后二維數(shù)組變?yōu)椋篭n"); print(a); printf("\n"); system("pause"); return 0;}
編譯運(yùn)行后的結(jié)果如下: