快速排序

比赛的时候有一道题,解题的时候我本来想用结构体数组存变量,然后对结构体数组中的其中一个量进行排序,但是当时不会自己编写对结构体的快排的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;
}
原文地址:https://www.cnblogs.com/rain-1/p/4764608.html