C排序算法

#include<stdio.h>
#include<time.h>
#include<stdlib.h>


void CreatArry(int *P,int length);
void Print(int Data[],int length );
void DireInserSort(int *P,int length);
void BinSort(int *P,int length);//二分法

void BooSort(int *P,int length);

void QuickSort(int *P,int low,int high); //high的下标表示
int PartiTion(int *P,int i,int j);
#define MaxLen 10
int main(void )
{
int DataArr[MaxLen]={0};
CreatArry(DataArr,MaxLen);
Print(DataArr,MaxLen);

//直接插入
//DireInserSort(DataArr,MaxLen);

//二分插入
//BinSort(DataArr,MaxLen);

//冒泡
//BooSort(DataArr,MaxLen);

//快速
QuickSort(DataArr,0,MaxLen);
Print(DataArr,MaxLen);
getchar();
}




//自动产生数组函数
//P 数组指针 length:数组长度,数组下标从0开始,
//所以 最高界限为:length-1
void CreatArry(int *P,int length)
{
srand(time(0));
int i=0;
for(i=0;i<length;i++)
{
*(P+i)=rand()%50+1;
}
}
//打印函数
void Print(int Data[],int length )
{
printf("顺序:");
int i=0;
for(i=0;i<length;i++)
{
printf(" %d",Data[i]);
}
printf("\n");
}

//直接插入
void DireInserSort(int *P,int length)
{
printf("直接插入");

int Temp;
int i=0; //控制 总共的循环次数
int j=0; //
for(i=1;i<length;i++)
{
if(P[i]<P[i-1]) //判断待插入,与已排序的最后一位 比较
{
Temp=P[i]; //保存待插入的副本
j=i-1;
while(Temp<P[j]) //如果已序表的元素 比 X大, 就后退,
{
P[j+1]=P[j];
j--;
}
P[j+1]=Temp;
}
}

Print(P,length);
}



//二分插入
void BinSort(int *P,int length)
{
printf("二分插入");
int low=0,high=0, mid=0;
int Temp;
int i=0,j=0;
for(i=1;i<length;i++)
{
low=0;
high=i-1;//high=i,这是错误的, 当2 1 ;1为待插入数据 属于 low=0 high=0
Temp=P[i];
while(low<=high)
{
mid=(low+high)/2;
if(Temp<P[mid])
high=mid-1;
else
low=mid+1;
}

for(j=i-1;j>=low;j--) //j>high+1 注意j>=high+1
{
P[j+1]=P[j];
}
P[low]=Temp;
}


Print(P,length);

}


//冒泡
void BooSort(int *P,int length)
{
printf("冒泡");
int Temp; //哨兵
int i,j;
for(i=0;i<length;i++)
{
for(j=0;j<length-i-1;j++)
{
if(P[j+1]<P[j])
{
Temp=P[j];
P[j]=P[j+1];
P[j+1]=Temp;
}
}
}
Print(P,length);
}


//快速排序
void QuickSort(int *P,int low,int high) //high的下标表示
{

int PriotPos=0;//基准位置



if(low<high)
{
PriotPos=PartiTion(P,low,high);
printf("第一次排序");
Print(P,MaxLen);
printf("\n");
QuickSort(P,low,PriotPos-1);
QuickSort(P,PriotPos+1,high);
}

}

int PartiTion(int *P,int i,int j)
{
int Priot=P[i];
while(i<j)//i<=j
{
while(i<j&&P[j]>=Priot)
{j--;}
//if(i<j)
P[i]=P[j];

while(i<j&&P[i]<=Priot)
{i++;}
//if(i<j)
P[j]=P[i];


}
P[i]=Priot;
return i;



}
原文地址:https://www.cnblogs.com/shenlian/p/2296292.html