#include <cstdio>
void qsort(int a[], int l, int r)
{
//if(l >= r) return ;
if(l < r)
{
int i = l, j = r, key = a[l];//中值
while (i < j)
{
while(i < j && a[j] >= key)// 从右向左找第一个小于x的数
j--;
if(i < j)
a[i++] = a[j];
while(i < j && a[i] < key)// 从左向右找第一个大于等于x的数
i++;
if(i < j)
a[j--] = a[i];
}
a[i] = key; //i==j了,找到了中值的位置,中值左边的值都比他小,右边的值都比他大
qsort(a, l, i - 1); // 递归调用
qsort(a, i + 1, r);
}
}
int main()
{
int a[] = {5, 4, 1, 3, 2};
qsort(a, 0, 4);
for(int i= 0 ; i < 5; i++)
printf("%d ", a[i]);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmpint(const void *a, const void *b)
{
return *(int *)a - *(int *)b; //排列整型数组
}
int cmpchar(const void *a, const void *b)//同int型
{
return *(char *)a - *(char *)b;
}
/*在对浮点或者double型的一定要用三目运算符,因为如果也使用整型那样的想减的话, 如果是两个很接近的数则可能返回一个小数(大于 -1,小于1),而cmp的返回值是int型, 因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系*/
int cmpdouble(const void *x, const void *y)//不知道为什么在c++文件中这个用不了
{
return *(double*)x > *(double*)y ? 1 : -1;
}
int main()
{
int i;
//对int类型数组排序
int a[6] = {5,4,1,3,2,6};
qsort(a, 6, sizeof(a[0]), cmpint);
for(i = 0; i < 6; i++)
printf("%d ",a[i]);
printf("\n\n");
int b[5] = {5,4,1,3,2};
qsort(b+2, 3, sizeof(b[0]), cmpint); //选中范围排序(从第3个数开始排序)
for(i = 0; i < 5; i++)
printf("%d ", b[i]);
printf("\n\n");
//对char类型数组排序(同int类型)
char s[] = "acBCAb";
int len = strlen(s);
qsort(s, len, sizeof(s[0]), cmpchar);
for(i = 0; s[i] != '\0'; i++)
printf("%c", s[i]);
printf("\n\n");
//对double类型数组排序(特别要注意)
double c[5] = {1.1,1.2,1.3,1.4,1.5};
qsort(c, 5, sizeof(c[0]), cmpdouble);
for(i = 0; i < 5; i++)
printf("%lf ", c[i]);
printf("\n\n");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node{
int age;
char name[10];
};
struct Node{
double data;
int other;
}s[100];
struct str{
int data;
char str[100];
}string[100];
int cmpstruct2(const void *a, const void *b)
{
return (*(struct Node *)a).data > (*(struct Node *)b).data ? 1 : -1;
}
//对结构体二级排序
//先对年龄排序,年龄相同再按姓名排序。
int cmpstruct1(const void *a, const void *b)
{
//先作下指针转换,再按要求比较
struct node *pnode1 = (struct node *)a;
struct node *pnode2 = (struct node *)b;
if(pnode1->age != pnode2->age)
return pnode1->age - pnode2->age;
else
return strcmp(pnode1->name, pnode2->name);
}
//对字符串进行排序
//按照结构体中字符串str的字典顺序排序
int cmpstr(const void *a, const void *b)
{
return strcmp((*(struct str *)a)->str, (*(struct str *)b)->str);
}