C语言的四种排序代码

来源:互联网 发布:js 模拟dos 编辑:程序博客网 时间:2024/05/17 23:05

快速排序:

#include"stdio.h"void quick_sort(int s[], int l, int r){ int k,a,b,m=s[l]; a=l,b=r; while(l<r) {  if(s[r]<=m)  {   s[l]=s[r];   s[r]=s[++l];   s[l]=m;  }  else r--;        quick_sort(s,a,l-1);  quick_sort(s,l+1,b); }}int main(){ int array[]={53,36,48,41,60,7,13,5,56}; int l=0,r=sizeof(array)/sizeof(int)-1;    quick_sort(array, l, r); for(l=0;l<=r;l++) printf("%d ",array[l]);    printf("\n");    return 0;}

选择排序:

#include"stdio.h"int main(){ int array[6]={24,70,12,85,106,8}; int i,j,n=0,middle,sub,min; for(j=0;j<6;j++) { min=array[n]; for(i=n;i<6;i++) {  if(min>array[i])  {   min=array[i];         sub=i;  } }    middle=array[n]; array[n]=array[sub]; array[sub]=middle; n++; }    for(j=0;j<6;j++) printf("%d ",array[j]);  printf("\n"); return 0;}

希尔排序:

#include"stdio.h"int main(){ int array[]={113,76,55,23,60,17,18,85,66,11}; int h,j,i,m,len=sizeof(array)/sizeof(int);    for(h=len/2;h>0;h=h/2) {  for(j=h;j<len;j++)  {       for(i=j-h;i>=0;i=i-h)   {    m=array[i];                if(array[i+h]<m)                {       array[i]=array[i+h];       array[i+h]=m;                }   }   } } for(j=0;j<len;j++) printf("%d ",array[j]); printf("\n"); getchar();    return 0;}

插入排序(复杂型):

#define null 0#include"stdio.h"#include"malloc.h"struct student {int num;struct student *next;};int n=0;struct student *create(void){struct student *head,*p1,*p2;p1=p2=(struct student*)malloc(sizeof(struct student));head=null;scanf("%d",&p1->num);while(p1->num!=null){n=n+1;if(n==1)head=p1;p1=(struct student*)malloc(sizeof(struct student));p2->next=p1;p2=p1;scanf("%d",&p1->num);}p1->next=null;return(head);}/*------------------   动态链表的建立-------------------*/struct student *paixu(struct student *head){struct student *listp,*limbo,*listx; /*----------------------------------------------------------------------------------------------------------   1.listP为无序区链表的遍历指针,作提取节点和有序区比较的作。   2.limbo为过渡指针,每当无序区遍历到的节点值小于有序区节点遍历到的值,则节点插到有序区链表的最后面,并且把     此节点的next地址设定为null,next为null为有序区链表遍历结束的条件,为了不使无序区的节点失去联系,需要把此  节点next的值赋值给limbo,再把null赋值给next,把limbo的值赋值给listp,使listP指向无序区下一个需要插入节点。   3.listx为有序区链表的便利指针,listx->next=null为遍历结束的标示。------------------------------------------------------------------------------------------------------------*/listp=limbo=listx=head;if(listp->num!=null){listp=listp->next;head->next=null;}else printf("链表为空,无法排序");/*-----------------------------------------------------------------------------------------   把第一个节点放入有序区,listp指向下一个需要比较的节点,然后把刚放入有序的阶段的next设为null。-------------------------------------------------------------------------------------------*/if(listp->num!=null){if(listp->num>head->num){limbo=listp->next;listp->next=head;head=listp;listp=limbo;}else{head->next=listp;limbo=listp->next;listp->next=null;listp=limbo;}}/*------------------------------------------------------------------------------------------------ 第二个节点放入有序区,如果大于有序区的首节点,就让有序区的头指针指向它,指针listP指向下一个需要 比较的节点;否则就把节点的next设置为null,在让指针p指向下一个需要比较的节点(利用过渡节点limbo)。-------------------------------------------------------------------------------------------------*/while(listp->num!=null){listx=head;while(listx->next!=null){if(listp->num>listx->num){limbo=listp->next;listp->next=head;head=listp;listp=limbo;break;} if(listp->num>=listx->next->num&&listp->num<=listx->num){limbo=listp->next;listp->next=listx->next;listx->next=listp;listp=limbo;break;}else{listx=listx->next;}}if(listx->next==null&&listp->num<listx->num){listx->next=listp;limbo=listp->next;listp->next=null;listp=limbo;}}/*-------------------------------------------------------------------------------------------------------------------------------- 把其余节点依次放入有序区, 如果大于有序区的首节点,就让有序区的头指针指向它,指针listP指向下一个需要比较的节点; 如果小于有序区的当前尾节点,插入在有序区链表尾部,把节点的next设置为null,让指针listp指向下一个需要比较的节点(用过渡节点limbo); 如果小于等于当前listx指向的节点并且大于等于listx->next指向的节点,就插入他们中间。---------------------------------------------------------------------------------------------------------------------------------*/return(head);/*------------------------- 把head的值返回给函数。--------------------------*/}int print(struct student *head){struct student *y;y=head;while(y){printf("%d ",y->num);y=y->next;}return 0;}/*--------------     链表输出---------------*/int main(void){struct student *head,*a;head=create();a=paixu(head);print(a);return 0;}


原创粉丝点击