① 【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数组中,然后循环进入第二行元素,重复上述步骤。。。