C语言的四种排序代码

快速排序:

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值