快速排序:
#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;
}