//shell (插入算法的升级版)
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define MAX 10
#define SWAP(x,y) {int t = x; x= y; y =t;}
int n=0;
void shell(int [],int);
void main()
{
int number[MAX]={0};
int i;
int gap;
srand(time(NULL));
printf("排序前:");
for(i = 0;i<MAX;i++)
{
number[i] = rand()%100;
printf("%d ",number[i]);
}
printf("\nshell排序算法:\n");
for(gap=MAX/2;gap>0;gap/=2)
shell(number,gap);
}
void shell(int number[],int gap)
{
int i,j,k,t;
printf("gap:%d\n",gap);
for(i=0+gap;i<MAX;i++)
{
t = number[i];
j= i-gap;
while(t<number[j])
{
number[j+gap] = number[j];
j-=gap;
if(j==-1||j<0)
break;
}
number[j+gap] = t;
printf("第%2d次排序:",++n);
for(k=0;k<MAX;k++)
printf("%d ",number[k]);
printf("\n");
}
printf("\n");
}
//快速排序 (三种)
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define MAX 10
#define SWAP(x,y) {int t=x;x=y;y=t;}
int partition(int number[],int ,int);
void kssort1(int [],int,int);
void kssort2(int [],int,int);
void kssort3(int [],int,int);
void main()
{
int number[MAX]={0};
int i;
srand(time(NULL));
printf("排序前:");
for (i=0;i<MAX;i++)
{
number[i] = rand()%100;
printf("%d ",number[i]);
}
printf("\n");
kssort3(number,0,MAX-1);
printf("排序后:");
for (i=0;i<MAX;i++)
{
printf("%d ",number[i]);
}
printf("\n");
}
void kssort1(int number[],int left,int right)
{
int l = left,r = right;
int s;
if (left<right)
{
s = number[left];
right++;
left--;
while(1)
{
while(number[++left]<s);
while(number[--right]>s);
if(left>=right){
break;
}
SWAP(number[left],number[right]);
}
// SWAP(number[l],number[right]);
kssort1(number,l,left-1);
kssort1(number,right+1,r);
}
}
void kssort2(int number[],int left,int right)
{
int l = left,r = right;
int s;
if (left<right)
{
s=number[(left+right)/2];
left--;
right++;
while(1)
{
while(number[++left]<s);//向右找
while(number[--right]>s);//向左找
if(left>=right)
break;
SWAP(number[left],number[right]);
}
kssort2(number,l,left-1);
kssort2(number,right+1,r);
}
}
int partition(int number[],int left,int right)
{
int i=left;
int j;
int s=number[right];
for (j=left;j<right;j++)
{
if(number[j]<=s)
{
SWAP(number[i],number[j]);
i++;
}
}
SWAP(number[i],number[right]);
return i;
}
void kssort3(int number[],int left,int right)
{
int p;
if (left<right)
{
p=partition(number,left,right);
kssort3(number,left,p-1);
kssort3(number,p+1,right);
}
}