排序方法——插入排序,选择排序,冒泡排序,快速排序,希尔排序

一,冒泡排序

外循环遍历n-1次

内循环从头向后交换,这样就能将最大的数字放到最后。

void selectsort(int a[MAX])//选择排序
{
    int i, temp, min, j;
    for (i = 0; i < MAX - 1; i++)
    {
        min = i;
        for (j = i + 1; j < MAX; j++)
        {
            if (a[j] < a[min])
            {
                min = j;
            }
        }
        if (min != i)
        {
            temp = a[min];
            a[min] = a[i];
            a[i] = temp;
        }
    }

}

二,选择排序

对数据量较少的序列实现升序或降序排序,可以考虑使用选择排序算法,它对应的时间复杂度为O(n2)

每次从待排序序列中找出最大值或最小值,查找过程重复 n-1 次。对于每次找到的最大值或最小值,通过交换元素位置的方式将它们放置到适当的位置,最终使整个序列变成有序序列。

与冒泡不同的是选择排序是直接找最小的放入指定的位置,而不是两两互相交换

void selectsort(int a[MAX])//选择排序
{
    int i, temp, min, j;
    for (i = 0; i < MAX - 1; i++)
    {
        min = i;
        for (j = i + 1; j < MAX; j++)
        {
            if (a[j] < a[min])
            {
                min = j;
            }
        }
        if (min != i)
        {
            temp = a[min];
            a[min] = a[i];
            a[i] = temp;
        }
    }

}

三,插入排序

初始状态下,将待排序序列中的第一个元素看作是有序的子序列。从第二个元素开始,在不破坏子序列有序的前提下,将后续的每个元素插入到子序列中的适当位置。

先将遍历的第一个数字及其位置记下来,然后将前面数字与比较,前面的值大,就将前面的值赋给后面。最后将对应放入的值位置更改为最开始的值。

void insertsort(int a[MAX])
{
    int  position, i = 0, insertdata;
    for (i = 0; i < MAX; i++)
    {
        insertdata = a[i];
        position = i;

        while (a[position - 1] > insertdata && position > 0)
        {
            a[position] = a[position - 1];
            position--;
        }
        if (position != i)
        {
            a[position] = insertdata;
        }
    }

}

四,希尔排序

需要分组的插入排序。

void  shellsort(int a[MAX])//希尔排序 (插入排序的优化)
{
    int gap = 1, position, i, insertdata;
    while (gap < MAX / 3)
    {
        gap = gap * 3 + 1;
    }
    while (gap > 0)
    {
        for (i = gap; i < MAX; i++)
        {
            insertdata = a[i];
            position = i;
            while (a[position - gap] >= insertdata && position > gap - 1)
            {
                a[position] = a[position - gap];
                position -= gap;
            }
            if (position != i)
            {
                a[position] = insertdata;
            }

        }
        gap = (gap - 1) / 3;
    }

}

五,快速排序(递归)

递归的方法,找一个关键值key。

从前向后找大于key值的放到high的位置。

从后向前找小于key的值放到low的位置。

low==high 的时候结束。

再排前半部分和后半部分

void partition(int* a, int low, int high)//快速排序
{
   
     int k = low;
    int j = high;
    if (low >= high)
        return;
    int key = a[k];
    while (k< j)
    {
        while (a[j] >= key&& k < j)
        {
            --j;
        }
        a[k] = a[j];
        while (a[k] <= key && k < j)
        {
            ++k;
        }
        a[j] = a[k];
    }
      a[k] = key;
    partition(a, low, j - 1);
    partition(a, j + 1, high);
   }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值