① 【c語言】如果想用qsort這樣的系統自帶函數給一個二維數組的某一橫行排序怎麼做
qsort是編譯器函數庫自帶的快速排序函數。其原型為:
void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
參數含義如下:
base: 待排序數組首地址。
num: 數組中待排序元素數量。
width: 各元素的佔用空間大小。
compare: 指向函數的指針,用於確定排序的順序。
比較難以理解的是compare函數指針,其確定了如何去排序,通過修改該函數指針指向的函數體,可以對復雜類型進行排序,如結構體等。 也可以改變排序方式,如升序或降序。
要達到問題中的效果,需要在第一個參數傳入數據所在行的首地址,第二個參數傳入一行中元素的個數,第三行傳入每個元素佔用的空間,第四個傳入自定義的比較函數指針(函數名)。
下面就以一個3行4列整型數組a[3][4],對其第二行(a[1])進行升序排序為例,寫一個代碼,輔助理解。
#include<stdio.h>
#include<stdlib.h>
intcmp(constvoid*a,constvoid*b)
{
return*((int*)a)>*((int*)b);//由於是整型數組,所以將指針轉為整型指針後取值,再比較。
}
intmain()
{
inta[3][4]=
{
5,1,54,6,
22,12,44,32,
34,5,2,1
};//定義的原始數組,可以看到是亂序的。
inti,j;
qsort(a[1],4,sizeof(int),cmp);
//以下代碼輸出數組元素值,以驗證排序結果。
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%3d",a[i][j]);
printf(" ");
}
return0;
}
程序運行後輸出:
51546
12223244
34521
可以看到第二行已經升序排列,而其它兩個沒有變化。
② C語言中快速排序法是怎麼用的,請給個例子進行說明
#include<stdio.h>
#include<stdlib.h>
intdata[]={12,30,15,17,19,22,26,33};
intmain()
{
inti,l=(sizeof(data)/sizeof(data[0]));
for(i=0;i<l;i++)printf("%d%c",data[i],(i<l-1)?32:10);
intcmp(constvoid*a,constvoid*b)
{
return(*(int*)a)-(*(int*)b);
}
qsort(data,l,sizeof(data[0]),cmp);
for(i=0;i<l;i++)printf("%d%c",data[i],(i<l-1)?32:10);
}
③ C語言中快速排序法的原理及應用
「快速排序法」使用的是遞歸原理,下面我結合一個例子來說明「快速排序法」的原理。首先給出一個數組{53,12,98,63,18,72,80,46, 32,21},先找到第一個數--53,把它作為中間值,也就是說,要把53放在一個位置,使得它左邊的值比它小,右邊的值比它大。{21,12,32, 46,18,53,80,72,63,98},這樣一個數組的排序就變成了兩個小數組的排序--53左邊的數組和53右邊的數組,而這兩個數組繼續用同樣的方式繼續下去,一直到順序完全正確。
一般來說,冒泡法是程序員最先接觸的排序方法,它的優點是原理簡單,編程實現容易,但它的缺點就是--程序的大忌--速度太慢。
附上快速排序代碼:
#include<stdio.h>
voidquicksort(inta[],intleft,intright)
{
inti,j,temp;
i=left;
j=right;
temp=a[left];
if(left>right)
return;
while(i!=j)
{
while(a[j]>=temp&&j>i)
j--;
if(j>i)
a[i++]=a[j];
while(a[i]<=temp&&j>i)
i++;
if(j>i)
a[j--]=a[i];
}
a[i]=temp;
quicksort(a,left,i-1);
quicksort(a,i+1,right);
}
voidmain()
{
inta[]={53,12,98,63,18,72,80,46,32,21};
inti;
quicksort(a,0,9);
/*排好序的結果*/
for(i=0;i<10;i++)
printf("%4d ",a[i]);
}
④ 求一個C語言數組的快速排序
void QuickSort(int data[],int low,int high)
{
int i ,pivotkey,j;
if(low<high){ /*以數組的第一個元素為基準進行劃分
pivotkey=data[low];i=low;j=high;
while(i<j){ /*從數組的兩端交替的向中間掃描
while(i<j&&data[j]>=pivotkey)j--;
if(i<j)
data[i++]=data[j];/*比基準元素小者移到低下標端
while(i<j&&data[i]<=pivotkey)i++;
if(i<j)
data[j--]=data[i]; /*比基準元素大的移到高下標端
}
data[i]=privotkey; /*改變基準元素
QuickSort(data,low,i-1);/*對前半個表遞歸
QuickSort(data,i+1,high);/*對後半個表遞歸
}
}
⑤ C語言,快速排序演算法
你好!
首先0,n-1。應該是數組的坐標(因為n個數字。所以數組的坐標是0到n-1)
而a是你傳入的數組。所以他會根據數組的坐標到數組中找到元素。比較並進行排序。
遞歸這段理解如下:
首先要了解快速排序的思想:
1)隨意找一個基準數。將比基準小的都放到它左邊。比它大的都放到它右邊。所以當返回基準的坐標的時候。其實這個坐標左邊都是小於它的,右邊都是大於等於它的。(這里主要是看代碼的實現。圖中代碼是大於等於在右邊。也可以自己寫小於等於在左邊。這個不影響最後結果)
2)那麼第二次對於返回基準坐標的左右兩邊。我們同樣利用返回的基準坐標找到兩個「基準」(如下圖)。就會使得返回的這兩個基準左右兩邊有序
第三次用返回的兩個基準找到四個基準(如圖)
然後不斷遞歸..不斷的在整體有序的情況下使局部變的有序。
假設為532348789
第一次以a【0】5為基準。
則:
圖中紅色標識為基準元素最後會使得數組全局有序。
希望能對你有所幫助。
⑥ c語言 涉及數組快速排序 有追加50分的!
冒昧的問一下樓主為什麼要自己編寫排序程序,stl有現成的sort命令啊,c語言也有qsort命令,為什麼不用啊?很快的。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class indivial
{
public:
double geti;
double shiying;
};
jiangxu(const indivial &p1,const indivial &p2)//按適應度降序排列
{
return (p1.shiying)>(p2.shiying);
}
void main()
{
int i;
vector<indivial> b(1000);
for(i=0;i<1000;i++)
{
b[i].geti=(double)i/17;
b[i].shiying=(double)i/27;
}
for(i=0;i<1000;i++)
{
cout<<b[i].geti<<" "<<b[i].shiying<<endl;
}
cout<<endl;
sort(b.begin(),b.end(),jiangxu);
for(i=0;i<1000;i++)
{
cout<<b[i].geti<<" "<<b[i].shiying<<endl;
}
cout<<endl;
}
如果對stl沒有信心的話,可以看一下《c語言數值演算法程序大全》這本書,其中在第八章著重討論了排序問題,給出了快速排序(劃分-交換排序法)和堆積排序法的源程序(作者認為這兩種方法比較好,尤其是第二種),這本書的英文版叫《Cambridge - Numerical Recipes in C》,我全都上傳到CSDN上了,你可以免費下載,有問題可以電郵聯系我
[email protected]
如果不是應付考試或者作業,我覺得你應該使用現成程序,這是《c++編程思想》一開篇就著重強調的編程規則。我編過很多遺傳演算法的程序,裡面大量的用到了排序演算法,我用stl的,沒問題的很快,請相信C++標准委員會。
⑦ C語言快速排序代碼
採用快速排序,用遞歸實現
#include <stdio.h>
#define N 10 //定義排序數組元素個數
int Qsort(int start,int length,int a[])//start排序的起始,length是要排序序列長度
{
int x = a[start];
int i,j;
i = start;
j = length -1;
while(i < j)
{
if(x < a[j])
j--;
else if(x > a[j])
{
a[i] = a[j];
a[j] = x;
i++;
}
else if(x < a[i])
{
a[j] = a[i];
a[i] = x;
j--;
}
else
i++;
}
if(start < length-1)
{
Qsort(start,i,a);
Qsort(i+1,length,a);
}
}
void main()
{
int a[N] = {0};
int i;
for(i = 0;i < N;i++)
scanf("%d",&a[i]);
Qsort(0,N,a);
for(i = 0;i < N;i++)
printf("%d ",a[i]);
}
程序執行時輸入N個數,對這N個數進行排序,可以預設N的長度
⑧ c語言實現二維數組排序
依次將一組中的元素進行分組判斷然後按順序打入一個相同數量元素的一維臨時數組,然後先進行平均值運算後取結果再將臨時數組的數據對應地放進4*5數組中,然後循環進入第二行元素,重復上述步驟。。。