快排相关
来源:互联网 发布:阿卢浮漂淘宝官网 编辑:程序博客网 时间: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:~$