几种常见排序的详细步骤(初学者参考)

#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);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值