快排相关

来源:互联网 发布:阿卢浮漂淘宝官网 编辑:程序博客网 时间:2024/06/06 02:04

【1】快排

(1)个数小的时候用插入排序;

(2)分割的基点用三个点的中位数。

#include <stdio.h>#include <stdlib.h>int *__median(int *a, int *b, int *c){    if(*a<*b)        if(*b<*c)            return b;        else            if(*a<*c)                return c;            else                return a;    else        if(*a<*c)            return a;        else            if(*b<*c)                return c;            else                return b;}void swap(int *a, int *b){    int t=*a;    *a=*b;    *b=t;}void insert_sort(int*a, int *b){    int i,j;    int n=b-a;    for(i=1;i<n;i++)    {        int t=a[i];        for(j=i-1;j>=0 && a[j]>t;j--)a[j+1]=a[j];            a[j+1]=t;    }}void qs(int* begin, int *end){    if(end-begin<5)                  // 长度小的时候,用插入排序    {        insert_sort(begin,end);        return;    }    int *p_swap=__median(begin, begin+((end-begin)>>1), end-1);  // 中位数    swap(begin, p_swap);    int i; //  for(i=0;i<end-begin; i++)   //     printf("%d \n", begin[i]);    //printf("\n");    int pivot=*begin;    int *s=begin;    int *e=end;    ++begin;    while(1)    {  //begin<e &&        while( *begin < pivot ){++begin;if(begin>e)printf("eee\n");}        --end;        //end>=s &&        while( *end > pivot)--end;        if(begin>=end)break;                swap(begin, end);        ++begin;    }    swap(end, s);    qs(s, end);    qs(begin, e);    }#define N 14int main(){    int ap[N]={4000,3,1,2};    int i;    for(i=3;i<N; i++)        ap[i]=rand()%1000;    for(i=0;i<N; i++)        printf("%d \n", ap[i]);    printf("\n");        qs(ap,ap+N);    for(i=0;i<N; i++)        printf("%d\n", ap[i]);    printf("\n");    for(i=0;i<N-1; i++)        if(ap[i]>ap[i+1])        {            printf("error\n");            break;        }    return 0;}

chen@chen-book1:~$ gcc t.c -o t
chen@chen-book1:~$ ./t
4000
3
1
383
886
777
915
793
335
386
492
649
421
362

1
3
335
362
383
386
421
492
649
777
793
886
915
4000

【2】求nth

#include <stdio.h>#include <stdlib.h>int *__median(int *a, int *b, int *c){    if(*a<*b)        if(*b<*c)            return b;        else            if(*a<*c)                return c;            else                return a;    else        if(*a<*c)            return a;        else            if(*b<*c)                return c;            else                return b;}void swap(int *a, int *b){    int t=*a;    *a=*b;    *b=t;}void insert_sort(int*a, int *b){    int i,j;    int n=b-a;    for(i=1;i<n;i++)    {        int t=a[i];        for(j=i-1;j>=0 && a[j]>t;j--)a[j+1]=a[j];            a[j+1]=t;    }}void nth(int* begin, int *end, int *pn){    if(end-begin<5)                  // 长度小的时候,用插入排序    {        insert_sort(begin,end);        return;    }    int *p_swap=__median(begin, begin+((end-begin)>>1), end-1);  // 中位数    swap(begin, p_swap);    int i;    int pivot=*begin;    int *s=begin;    int *e=end;    ++begin;    while(1)    {  //begin<e &&        while( *begin < pivot ){++begin;if(begin>e)printf("eee\n");}        --end;        //end>=s &&        while( *end > pivot)--end;        if(begin>=end)break;                swap(begin, end);        ++begin;    }        swap(end, s);    if(end>=pn)        nth(s, end, pn);    else        nth(end, e, end+(pn-end));    }#define N 14int main(){    int ap[N]={4000,3,1,2};    int i;    for(i=3;i<N; i++)        ap[i]=rand()%1000;    for(i=0;i<N; i++)        printf("%d \n", ap[i]);    printf("\n");    int x=9;                  // 第10小的数字    nth(ap,ap+N,ap+x); // 第x+1小的数字    for(i=0;i<N; i++)        printf("%d\n", ap[i]);    printf("\n");    for(i=0;i<x; i++)        if(ap[i]>ap[x])        {            printf("error\n");            break;        }    for(i=x+1;i<N; i++)        if(ap[i]<ap[x])        {            printf("error\n");            break;        }    return 0;}

chen@chen-book1:~$ gcc t.c -o t
chen@chen-book1:~$ ./t
4000
3
1
383
886
777
915
793
335
386
492
649
421
362

335
3
1
383
362
386
421
492
649
777                            9
793
4000
915
886

【3】单链表快排

注意:应该交换指针,不能交换值。另外,这里不是用交换的思路来解决的。

参考:http://blog.csdn.net/yangalbert/article/details/7577782

#include <stdlib.h>#include <stdio.h>struct node{    int v;    struct node *next;};// 两个子链表。// 起初:head->f->...; pivot=f->v// 然后,第一个子链表:head->..->p 比pivot小的数// 第二个子链表:f->..->q,大于等于pivot的数字void nsort(struct node *head, struct node*end){    if(head->next==end || head->next->next==end) // 0/1个元素        return;            struct node *p=head;    struct node *f=head->next; // fixed    struct node *q=head->next;    int pivot=f->v; //fixed    struct node*t=f->next;        while(t!=end) // 不是while(t)    {        if(t->v < pivot)        {            p->next=t;            p=p->next;        }else        {            q->next=t;            q=q->next;        }        t=t->next;    }    p->next=f;    q->next=end;        nsort(head,f);    nsort(f,end);}int main(){    struct node head={0, &head};    int n=10;    int i;    struct node *pt=&head;    struct node *p;    for(i=0; i<n; i++)    {        p=(struct node*)malloc(sizeof( struct node) );        p->v=rand()%100;        pt->next=p;        pt=pt->next;    }    pt->next=NULL;            ///    nsort(&head,NULL);        ///    pt=(&head)->next;    while(pt)    {        printf("%d\n", pt->v);        pt=pt->next;    }    pt=(&head)->next;    while(pt)    {        p=pt;        pt=pt->next;        free(p);    }    return 0;    }

chen@chen-book1:~$ gcc node.c -o node -g
chen@chen-book1:~$ ./node
15
21
35
49
77
83
86
86
92
93
chen@chen-book1:~$


原创粉丝点击