各种排序算法实现

/*
2016年7月7日20:30:37

排序的目的:查找
排序是查找的前提(google搜索)
分类:
冒泡(稳定O(n^2))
插入(稳定O(n^2)),从前往后依次插入到前面的有序部分,始终保持前面部分有序
选择(n^2),先从所有序列中选择最小的数字与第一个数字互换,再从余下的序列中寻找次最小值与第二个数字互换。。。
快排(最理想 O(nlogn) 最差O(n^2)),先找第一个元素的确切位置,把序列分成两半;再找左边第一个元素的位置,分成两半;再找右边第一个元素的位置。。。
归并(稳定nlgn),先两个一组排序,保证组内有序;再四个一组排序,保证组内有效;再八个
*/

1、冒泡排序

void bubble_sort(int* a, int len)//有效长度
{
    int i, j, t;
    for (i = 0; i < len - 1; i++)
    {
        for (j = i+1; j < len; j++)
        {
            if (a[i] < a[j])//降序
            {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
    }
    return;
}

2、插入排序

void insert_sort(int* a, int len)//将无序部分的第一个元素插入到前面有序部分
{
    int i, j;
    for (i = 1; i < len; i++)
    {
        int temp = a[i];

        for (j = i-1; j >= 0 && a[j] > temp; --j)
        {
            a[j+1] = a[j];//依次往后移
        }
        a[j+1] = temp;//不满足条件后跳出循环,j 必然 -1
    }
}

3、选择排序

void select_sort(int* a, int len)//选择最小值与第一个元素交换,再在余下的元素中选择次小值与第二个元素交换
{
    int i, j, t;
    int min;

    for (i = 0; i < len - 1; i++)//选择的最后一个元素必然是最大值,所以是 len-1
    {
        min = i;
        for (j = i+1; j < len; j++)
        {
            if (a[j] < a[min])
            {
                min = j;
            }
        }
        t = a[i];
        a[i] = a[min];
        a[min] = t;
    }
}

4、快速排序

int FindPos(int* a, int low, int high)
{
    int val = a[low];//不能是 a[0]
    while (low < high)
    {
        while (low < high && a[high] >= val)
            --high;
        a[low] = a[high];

        while (low < high && a[low] <= val)
            ++low;
        a[high] = a[low];
    }
    a[low] = val;
    return low;
}

void quick_sort(int* a, int low, int high)//第二个参数表示第一个元素的下标,第三个参数表示最后一个元素的下标
{
    int pos;
    if (low < high)
    {
        pos = FindPos(a, low, high);
        quick_sort(a, low, pos -1);
        quick_sort(a, pos+1, high);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值