#include <iostream>
#include <cstdlib>
using namespace std;
void insort(int *,int);
void csort(int *,int);
void print(int *,int);
void quick(int *,int,int);
int p(int *,int,int);
int main()
{
int a[11],i,n=10;
for(i=1;i<=n;i++)
a[i] = rand()%1000;
print(a,n);
csort(a,n); print(a,n);
insort(a,n);print(a,n);
quick(a,1,n);
print(a,n);
return 0;
}
void print(int a[],int n)
{
int i;
for(i=1;i<=n;i++)
cout<<a[i]<<' ';
cout<<endl;
}
void insort(int a[],int n)//直接插入排序
{
int i,j;
for(i=2;i<=n;i++)//从第二个元素开始依次向前比较
{
a[0] = a[i];//先将a[i]的值赋给a[0],让a[i]的值能被保存,这样就可以空出一个位置让后面挑出一个可以插入的位置
j = i-1;//j始终是i前面(左面)的那个数
while(a[0]<a[j])//挑出当前面有比这个数大的数
{
a[j+1] = a[j];//让它依次等于它左边那个数的值,
j--;//也就是让有规律的数都向左移位,
}//直到那个不规则的数。
a[j+1] = a[0];//这时候,前面都移动好啦,a[j]就和a[j+1]的值一样啦,就可以把a[0]的值给a[j+1]啦
}
}
void csort(int a[],int n)//选择排序
{
int i,j,t,k;//先定义i,j和杯子t,还有选择下标k
for(i=1;i<n;i++)
{
k = i;//先让每次循环所选择的下标值为i
for(j=i+1;j<=n;j++)//j则是i右边的那个数
if(a[k]>a[j])//挑出来,如果选择的那个元素大于它右边的某一元素,而且经历一次for循环后,这个选择出来的元素一定是这里面最小的那个
k = j;//就让那个选择的元素为a[j],也就是把j的值赋给下标k
if(a[i]!=a[k])//如果此时的当前最左边元素a[i]和a[k]的值不相等
{
t = a[k];
a[k] = a[i];
a[i] = t;//交换值
}
}
}
int p(int a[],int low,int high)//这个其实就是挑出最中间的数
{
int t,key = a[low];//先让关键值等于最左边的元素
while(low<high)//因为下面high不断减小,low不断增加,最终一定会有low>=high
{
while(low<high&&a[high]>=key)//这是挑出从右边往左边比关键值小的数字
high--;//依次从右往左挑
t = a[low];
a[low] = a[high];
a[high] = t;//这段是把右边小的数放在关键值的左边,第一次的时候就是把a[0]给换过去
while(low<high&&a[low]<=key)//这同理挑出从左往右比关键值大的数字
low++;
t = a[high];
a[high] = a[low];
a[low] = t;
}
// a[low] = key;
return low;//返回中间点那个数
}
void quick(int a[],int low,int high)//这时递归分别对关键值两边的数列进行快速排序
{
if(high>low)
{
int j = p(a,low,high);
quick(a,low,j-1);
quick(a,j+1,high);
}
}
#include <cstdlib>
using namespace std;
void insort(int *,int);
void csort(int *,int);
void print(int *,int);
void quick(int *,int,int);
int p(int *,int,int);
int main()
{
int a[11],i,n=10;
for(i=1;i<=n;i++)
a[i] = rand()%1000;
print(a,n);
csort(a,n); print(a,n);
insort(a,n);print(a,n);
quick(a,1,n);
print(a,n);
return 0;
}
void print(int a[],int n)
{
int i;
for(i=1;i<=n;i++)
cout<<a[i]<<' ';
cout<<endl;
}
void insort(int a[],int n)//直接插入排序
{
int i,j;
for(i=2;i<=n;i++)//从第二个元素开始依次向前比较
{
a[0] = a[i];//先将a[i]的值赋给a[0],让a[i]的值能被保存,这样就可以空出一个位置让后面挑出一个可以插入的位置
j = i-1;//j始终是i前面(左面)的那个数
while(a[0]<a[j])//挑出当前面有比这个数大的数
{
a[j+1] = a[j];//让它依次等于它左边那个数的值,
j--;//也就是让有规律的数都向左移位,
}//直到那个不规则的数。
a[j+1] = a[0];//这时候,前面都移动好啦,a[j]就和a[j+1]的值一样啦,就可以把a[0]的值给a[j+1]啦
}
}
void csort(int a[],int n)//选择排序
{
int i,j,t,k;//先定义i,j和杯子t,还有选择下标k
for(i=1;i<n;i++)
{
k = i;//先让每次循环所选择的下标值为i
for(j=i+1;j<=n;j++)//j则是i右边的那个数
if(a[k]>a[j])//挑出来,如果选择的那个元素大于它右边的某一元素,而且经历一次for循环后,这个选择出来的元素一定是这里面最小的那个
k = j;//就让那个选择的元素为a[j],也就是把j的值赋给下标k
if(a[i]!=a[k])//如果此时的当前最左边元素a[i]和a[k]的值不相等
{
t = a[k];
a[k] = a[i];
a[i] = t;//交换值
}
}
}
int p(int a[],int low,int high)//这个其实就是挑出最中间的数
{
int t,key = a[low];//先让关键值等于最左边的元素
while(low<high)//因为下面high不断减小,low不断增加,最终一定会有low>=high
{
while(low<high&&a[high]>=key)//这是挑出从右边往左边比关键值小的数字
high--;//依次从右往左挑
t = a[low];
a[low] = a[high];
a[high] = t;//这段是把右边小的数放在关键值的左边,第一次的时候就是把a[0]给换过去
while(low<high&&a[low]<=key)//这同理挑出从左往右比关键值大的数字
low++;
t = a[high];
a[high] = a[low];
a[low] = t;
}
// a[low] = key;
return low;//返回中间点那个数
}
void quick(int a[],int low,int high)//这时递归分别对关键值两边的数列进行快速排序
{
if(high>low)
{
int j = p(a,low,high);
quick(a,low,j-1);
quick(a,j+1,high);
}
}