zoukankan      html  css  js  c++  java
  • 快速排序

    比赛的时候有一道题,解题的时候我本来想用结构体数组存变量,然后对结构体数组中的其中一个量进行排序,但是当时不会自己编写对结构体的快排的cmp函数,只会写对一般数组进行排序的cmp,于是用的另一种方法,刚研究了下对结构体排序。

    同学用c++写了一个cmp函数对那个结构体数组进行排序,还是用的sort,他说要看看stl的话对那个会理解一点,可是那个好多呀,于是我看了c语言的快排,希望把这个快排改编以下,以便对结构体排序

    对普通数组排序的快排代码如下

    思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,

    然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。下面代码详细讲。

    参考处:http://blog.sina.com.cn/s/blog_70441c8e0100pxuh.html

    #include <stdio.h>
    void quiksort(int a[],int low,int high)
    {
        int i = low;
        int j = high;
        int temp = a[i];
    
        if( low < high)
        {
            while(i < j)
            {
                while((a[j] >= temp) && (i < j))
                {
                    j--;
                }
                a[i] = a[j];
                while((a[i] <= temp) && (i < j))
                {
                    i++;
                }
                a[j]= a[i];
            }
            a[i] = temp;
            quiksort(a,low,i-1);
            quiksort(a,j+1,high);
        }
        else
        {
            return;
        }
    }
    
    int main()
    {
        int arry[5] = {23,1,21,4,19};
        quiksort(arry,0,4);
        for(int i=0;i<5;i++)
        {
            printf("%d ",arry[i]);
        }
        printf("
    ");
    }

    下面是我测试快排方法的代码,大概就是

    从后往前依次寻找比a[0]小的数,把这个数赋给前面曾经找到并记住的的比a[0]大的数的位置上

    从前往后依次寻找比a[0]大的数,把这个数赋给后面曾经找到并记住的的比a[0]小的数的位置上

    第一次也不用担心,第一次是从后往前找,所以是把先找到的那个数赋到原a[0]的位置了

    直到两边找到的数撞上

    这时候把原来的a[0]赋给撞上的那个数

    最后 quiksort(a,low,i-1); quiksort(a,j+1,high);即对分开的两部分再排序。

    #include <stdio.h>
    void quiksort(int a[],int low,int high)
    {
        int i = low;
        int j = high;
        int temp = a[i];
        if( low < high)
        {
            while(i < j)
            {
                while((a[j] >= temp) && (i < j))
                {
                    j--;
                    printf("j = %d
    ", j);
                }
                a[i] = a[j];
                printf("a[i] = %d
    ", a[i]);
                for(int k = 0; k < 7; k++)
                    printf("%d ", a[k]);
                printf("
    ");
                while((a[i] <= temp) && (i < j))
                {
                    i++;
                    printf("i = %d
    ", i);
                }
                a[j]= a[i];
                for(int k = 0; k < 7; k++)
                    printf("%d ", a[k]);
                printf("
    ");
                printf("a[j] = %d
    ", a[j]);
            }
    
            a[i] = temp;
            quiksort(a,low,i-1);
            quiksort(a,j+1,high);
        }
        else
        {
            return;
        }
    }
    
    int main()
    {
        int arr[7] = {49, 38, 65, 97, 76, 13, 27};
        for(int i = 0; i < 7; i++)
            printf("%d ", arr[i]);
        printf("
    ");
        quiksort(arr,0,6);
        for(int i=0;i<7;i++)
        {
            printf("%d ",arr[i]);
        }
        printf("
    ");
    }

    下面是他的那道题的代码,等我能看懂的时候再看,题目出处

    #include <algorithm>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    using namespace std;
    struct ss
    {
        int a;
        int b;
    }time[20020];
    
    int cnt[20010];
    
    int cmp(const ss &c,const ss &d)
    {
        return c.a<d.a;
    }
    
    int cmp2(const void *x, const void *y)
    {
        return *(int *)x - *(int *)y;
    }
    
    
    int main()
    {
        int t,n,l,i,cnt1,cnt2,ans,hr,mi,sec;
        scanf("%d",&t);
        while(t--)
        {
            memset(cnt,0,sizeof(cnt));
            memset(time,0,sizeof(ss));
            scanf("%d%d",&n,&l);
            for(i=1;i<=n;i++)
            {
                scanf("%d:%d:%d",&hr,&mi,&sec);
                time[i].a = hr*3600 + mi*60 + sec;
                time[i].b = i;
            }
            sort(time+1,time+n+1,cmp);
            cnt1 = 1;
            cnt2 = 2;
            ans = 1;
            cnt[0]=time[1].b;
            while(cnt2!=n+1)
            {
                if(time[cnt2].a-time[cnt1].a<l)
                {
                    cnt2++;
                }
                else
                {
                    cnt1 = cnt2++;
                    cnt[ans++] = time[cnt1].b;
                }
            }
            qsort(cnt,ans,sizeof(cnt[0]),cmp2);
            printf("%d
    ",ans);
            for(i=0;i<ans-1;i++)
                printf("%d ",cnt[i]);
            printf("%d
    ",cnt[ans-1]);
        }
        return 0;
    }
  • 相关阅读:
    java操作elasticsearch实现批量添加主要使用了bulk
    es java scroll滚动查询
    利用Redis Sorted Set实现排行榜功能
    Elasticsearch -删除索引(index)
    Redis简单案例(一) 网站搜索的热搜词
    283 约束布局之1—约束布局简介
    282 Android基本布局之4—网格布局实现计算器布局
    使用Layui、Axios、Springboot(Java) 实现EasyExcel的导入导出(浏览器下载)
    layui在toolbar使用上传控件在reload后失效的问题解决
    axios提交表单
  • 原文地址:https://www.cnblogs.com/rain-1/p/4764608.html
Copyright © 2011-2022 走看看