【算法篇】排序——快速排序(c语⾔)
【算法篇】排序——快速排序(c语⾔)
核⼼思想
排序算法的思想⾮常简单,在待排序的数列中,⾸先要找⼀个数字作为基准数(这只是个专⽤名词)。为了⽅便,我们⼀般选择第 1
个数字作为基准数(其实可以随便选)。然后把这个待排序的数列中⼩于基准数的元素移动到它的左边,⼤于它的移到右边。这时,左
右两个分区的元素就相对有序了;接着把两个分区的元素分别重复上述步骤,直到各个分区只有⼀个数时为⽌。
代码⽰例
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
void quick_sort(int l, int r)
{
int mid = in[(l + r) / 2];//
这⾥是选择中间值作为基准
int i = l, j = r;
do
{
while (in[i] < mid)
顺帝 i++; //
找到左边⽐基准值⼤的数的位置
while (in[j] > mid)
j--; //
找右红萝卜丝 边⼩的
if (i <= j)
{
swap(&(in[i]), &(in[j])); //
交换使左边的⼩右边的⼤
i++;
j--;
}
} while (i <= j);
if(l<j)
quick_sort(l, j);//
排左边
if(r>i)
quick_sort(i, r);//
排右边
}
当然了⼀般情况下不⽤⾃⼰写(毕竟有现成的)
来看⼀下炒鸡好⽤的qsort函数
qsort函数的⽤法
函数声明
void qsort(void *ba, size_t nitems, size_t size, int (*compar)(const void ))
, const void
参数说明
ba-- 指向要排序的数组的第⼀个元素的指针。
nitems-- 由 ba 指向的数组中元素的个数。
size-- 数组中每个元素的⼤⼩,以字节为单位。
compar-- ⽤来⽐较两个元素的函数,即函数指针(回调函数)
compar函数的形式决定了对谁排序
int compar(const void *p1, const void *p2);
compar函数的返回值描述
<0p1所指向元素将被排在p2所指向元素的左⾯
=0p1所指向元素与p2所指向元素的顺序不确定
>0p1所指向元素会被排在出发英文 p2所指向元素的右⾯
具体⽤法说明
对⼀维数组
int comp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
对⼆维数组
int comp(const void*a,const void*b)
{
return ((int*)a)[0]-((int*)b)[0];
}
对字符串
int Comp(const void*p1,const void*p2)
{
return strcmp((char*)p2,(char*)p1);
}
int main()
海南陵水旅游攻略 {
char a[MAX1][MAX2];
initial(a);
qsort(a,lenth,sizeof(a[0]),Comp);
//lentha
为数组的长度
}
对结构体⼀级排序
struct Node
{
double data;
int other;
}s[100];
int Comp(constvoid*p1,constvoid*p2)
{
return(*(Node*)p2红楼梦阅读感想 ).data>(*(Node*)p1).data?1:-1;
}
qsort(s,100,sizeof(s[0]),Comp);
对结构体多级排序
struct Node
{
int x;
int y;
}s[100];
//xxy
按照从⼩到⼤排序,当相等时按从⼤到⼩排序
int Comp(const void*p1,const void*p2)
{
struct Node*c=(Node*)p1;
struct 玉树的养殖方法 Node*d=(Node*)p2;
if(c->x!=d->x)returnc->x-d->x;
el return d->y-c->y;
}
对结构体的字符串
日本spa struct Node
{
int data;
char str[100];
}s[100];
//str
按照结构体中字符串的字典序排序
int Comp(const void*p1,const void*p2)
{
return strcmp((*(Node*)p1).str,(*(Node*)p2).str);
}
qsort(s数据库技术与应用 ,100,sizeof(s[0]),Comp);
本文发布于:2023-04-20 21:20:33,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/82/506530.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |