c++排序(选择,冒泡,插入)

本文详细介绍了三种基础排序算法:选择排序、冒泡排序和插入排序。选择排序通过每次选取最小元素与首位交换实现排序;冒泡排序通过相邻元素比较交换达到排序目的,是一种稳定排序;插入排序则类似扑克牌排序,逐个元素找到合适位置插入已排序序列。三种算法各有特点,适用于不同场景。
摘要由CSDN通过智能技术生成

一、选择排序

(1)算法思想

从头至尾扫描序列,找到最小的一个元素,和第一个元素交换,接着再从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。

(2)具体实现方法

①初始状态:无序区为R[0..n-1](共n个元素),有序区为空。 [1] 

②第1趟排序

设置一个变量i,让i从0至n-2循环的同时,在对比数组中元素i跟元素i+1的大小,如果R[i+1]比R[i]小,则用一个变量k来记住他的位置(即k=i+1)。等到循环结束的时候,我们应该找到了R中最小的那个数的位置了。然后进行判断,如果这个最小元素的不是R的第一个元素,就让第一个元素跟他交换一下值,使R[0..0]和R[1..n-1]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。 [1]  [2] 

……

③第i趟排序

第i趟排序开始时,当前有序区和无序区分别为R[0..i-1]和R[i..n-1]。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[0..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。 [1]  [2] 

图1为一个具体例子:(通过寻找最小值的选择排序) [2] 

(3)参考伪代码

 二、冒泡排序

(1)算法思想

依次比较相邻的两个数,小的放前面,大的放后面。

1.先比较第一个数和第二个数,小的放前面,大的放后面。

2.比第二个和第三个数...

3.知道比到最后两个数

4.第一次结束,最大的一定沉到最后

重复上述过程

(2)算法稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

(3)代码实现

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

三、插入排序

(1)基本思想

插入排序的工作方式像许多人排序一手扑克牌。开始时,我们的左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较。拿在左手上的牌总是排序好的,原来这些牌是桌子上牌堆中顶部的牌。

插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序 。

(2)时间复杂度和空间复杂度

时间复杂度

在插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较N- 1次,时间复杂度为O(n) 。

最坏的情况是待排序数组是逆序的,此时需要比较次数最多,总次数记为:1+2+3+…+N-1,所以,插入排序最坏情况下的时间复杂度为O(n²)  。

平均来说,A[1..j-1]中的一半元素小于A[j],一半元素大于A[j]。插入排序在平均情况运行时间与最坏情况运行时间一样,是输入规模的二次函数 。

空间复杂度

插入排序的空间复杂度为常数阶O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值