排序--简单排序

Posted 可口可乐不加冰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序--简单排序相关的知识,希望对你有一定的参考价值。

一、冒泡排序

原理:从第一个元素开始遍历比较,如果相邻元素大于它,就做一次交换,冒泡完成的元素不参与下一次比较,由此可见越往后的元素需要比较的次数递减,for循环可实现。

源代码:

void bubble_sort(int *array, int size_array)
{
    for(int j = size_array ; j >= 0; j--)
    {
        int flag = 0;
        for(int i = 0; i< j; i++)
        {
            if(array[i] > array[i + 1])
            {
                swap(&array[i],&array[i+1]);
                flag = 1;
            }
        }
        if(flag == 0) break;
    }
}
 
二、插入排序
原理:从第二个元素开始向前比较判断,如果比前一个元素小,则前一个元素往后移动一位,直到第一个元素或者前面条件不成立,将该元素插入当前位置。
源代码:
void insertion_sort(int *array, int size_array)
{
    for(int j = 1 ;j <=size_array; j++)
    {
        int i = j;
        int temp = array[j];
        for(; i > 0 && temp < array[i - 1]; i--)
            array[i] = array[i - 1];
        array[i] = temp;
    }
}
 
三、选择排序
原理:可以简单理解为冒泡的逆过程,从第一个元素开始,找出所有元素的最小值,将最小值和第一个元素交换,依次类推,从第二个第三个做同样的操作,最后得到一个有序序列
源代码:
void selection_sort(int *array, int size_array)
{
    for(int i = 0; i < size_array; i++)
    {
        int min_position = i;
        for(int j = i; j< size_array; j++)
        {
            if(array[min_position] > array[j])
            min_position = j;

        }
        swap(&array[i],&array[min_position]);
    }
}
 
 
 
四、希尔排序
原理:可以看作是插入排序的升级,前两种排序最坏时间复杂度都是O(N^2),希尔排序不采用相邻两个元素之间进行比较插入,而是选择有一定间隔的元素之间进行比较插入,原因是为了能一次消除多个逆序对,减少时间复杂度,间隔的大小按规则减小,直到间隔为1进行一次插入排序,得到有序的元素序列。
关键:选取增量序列
源代码:
void shell_sort(int *array, int size_array)
{
    int N = (size_array + 1)/2;
    for(int k = N; k > 0; k /= 2)
    {
        for(int j = k ;j <=size_array; j++)
        {
            int i = j;
            int temp = array[j];
            for(; i > k - 1 && temp < array[i - k]; i -= k)
                array[i] = array[i - k];
            array[i] = temp;
        }
    }
}
 

以上是关于排序--简单排序的主要内容,如果未能解决你的问题,请参考以下文章

简单选择排序就是简单~~~

选择排序(简单选择排序和堆排序)

排序算法2--简单选择排序堆排序

插入排序(直接插入排序希尔排序);交换排序(冒泡排序快速排序);选择排序(简单选择排序堆排序);归并排序和基数排序;基于关键词比较的排序算法下界分析

八大基础排序总结

经典排序算法--简单选择排序