关于排序的一点点东西(1)

195 阅读2分钟

写在前面

最近复习算法的东西。于是在网上查找相关资料,重新了解下几种常见的排序算法。(表格中空白的地方,待了解到那里来的时候再填上😀)

时间复杂度和空间复杂度概念就不用解释了,稳定性这个东西已经忘记是什么了(算法老师不要打我)。看看了资料,原来说的是:排序前两个相等的数据在序列中的顺序与排序后的顺序相同。

一、选择排序

简单的说就是每次都去查找数组中最小的指放在最前面。看了下面这个动图应该就一目了然了。

图片来源维基百科 代码实现为
void selectionSort(int arr[], int len)
{
    for (int i = 0 ; i < len - 1 ; i++)
    {
        int min = i;
        for (int j = i + 1; j < len; j++)     
            if (arr[j] < arr[min])    
                min = j;
        int temp = arr[min];
        arr[min] = arr[i];
        arr[i]=temp;
    }
}

这个排序要进行2次循环,所以时间复杂度为O(n²),并没有开辟新的存储空间,所以空间复杂度为O(1)。这种排序是不稳定的,在交换的时候,有可能会更改2个相同数据的位置。比如[5(1),5(2),1]这样一个数组。在进行遍历的后就会变成[1,5(2),5(1)]第1个5就被交换到了第2个5的后面。

二、冒泡排序

冒泡排序就是比较相邻的两个数,如果顺序错误就交换一下。这样就不停的把大的数往后面送,然后从数组的末尾到头部依次排好序。由于冒泡排序只是相邻的两个数相交换,所以这个排序算法是稳定的。

void bubbleSort(int arr[],int len)
{
    for (int i=0; i<len - 1; i++) {
        for (int j=0; j<len-1-i; j++) {
            if (arr[j]>arr[j+1]){
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
}

举个例子:
arr = [6, 1, 5, 3, 7] 第一次外循环

变化 交换
( 6 1 5 3 7 ) → ( 1 6 5 3 7 ) 6 > 1 交换位置
( 1 6 5 3 7 ) → ( 1 5 6 3 7 ) 6 > 5 交换位置
( 1 5 6 3 7 ) → ( 1 5 3 6 7 ) 6 > 3 交换位置
( 1 5 3 6 7 ) → ( 1 5 3 6 7 ) 6 < 7 位置不变

第二次外循环(除开最后一个元素8,对剩余的序列)

变化 交换
( 1 5 3 6 7 ) → ( 1 5 3 6 7 ) 1 < 5 位置不变
( 1 5 3 6 7 ) → ( 1 3 5 6 7 ) 5 > 3 交换位置
( 1 3 5 6 7 ) → ( 1 3 5 6 7 ) 5 < 6 位置不变

第三次外循环

变化 交换
( 1 3 5 6 7 ) → ( 1 3 5 6 7 ) 1 < 3 不变
( 1 3 5 6 7 ) → ( 1 3 5 6 7 ) 3 < 5 不变

第四次外循环(最后一次)

变化 交换
( 1 3 5 6 7 ) → ( 1 3 5 6 7 ) 1 < 3 不变

下次再见...