快速排序

#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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值