基础排序算法–冒泡排序、选择排序和插入排序

基础排序算法–冒泡排序、选择排序和插入排序

1.冒泡排序

冒泡排序算法运行速度非常慢,但它概念最为简单,适用于初步研究排序算法。

1.1 算法描述

冒泡排序:依次比较相邻的数据,将小数据放在前,大数据放在后;即第一趟先比较第1个和第2个数,大数在后,小数在前,再比较第2个数与第3个数,大数在后,小数在前,以此类推则将最大的数”冒泡”到最后一个位置;第二趟则将次大的数滚动到倒数第二个位置……第n-1(n为无序数据的个数)趟即能完成排序。
这里写图片描述

1.2 算法实现
template<typename T>
void bubbleSort(T arr[],int n){
    for(int i = n-1; i > 0; i--){
        for(int j = 0; j < i && arr[j] > arr[j+1]; j++){
            swap(arr[j],arr[j+1]);          
        }
    }
}
1.3 算法分析
  • 冒泡排序最好的情况是初始状态是正序的,一次扫描即可完成排序,所以最好的时间复杂度为O(N);最坏的情况是反序的,此时最坏的时间复杂度为O(N2)。平均情况,每轮N/2次循环,N轮时间复杂度为O(N2)。
  • 算法是稳定的,因为当a=b时,由于只有大于才做交换,故a和b的位置没有机会交换,所以算法稳定。
  • 空间复杂度为O(1),不需要额外空间。
1.4 算法优化

可以对冒泡排序算法进行简单的优化,用一个标记来记录在一趟的比较过程中是否存在交换,如果不存在交换则整个数组已经有序退出排序过程,反之则继续进行下一趟的比较。

template<typename T>
void bubbleSort(T arr[],int n){
    BOOL flag = FALSE;
    for(int i = n-1; i > 0; i--){
        flag = FALSE;
        for(int j = 0; j < i && arr[j] > arr[j+1]; j++){
            flag = TRUE;
            swap(arr[j],arr[j+1]);          
        }
        if (!flag)  //上一轮比较没有进行交换,则退出排序
            break;
    }
}

2.选择排序

1.1 算法描述

选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换……第N-1趟遍历剩下的2个数据,找出其中最小的数值与第N-1个元素交换,至此选择排序完成。

1.2 算法实现
template<typename T>
void selectionSort(T arr[],int n){
    for (int i = 0; i < n; i++){
        int minIndex = i;
        for(int j = i; j < n && arr[j] < arr[minIndex]; j++){
            minIndex = j;           
        }
        swap(arr[i],arr[minIndex]);
    }
}
1.3 算法分析
  • 平均时间复杂度:O(n2)
  • 空间复杂度:O(1) (用于交换和记录索引)
  • 稳定性:不稳定 (比如序列【5, 5, 3】第一趟就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)

3.插入排序

1.1 算法描述

直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的纪录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的纪录插入完为止,得到一个新的有序序列。
这里写图片描述

1.2 算法实现
template<typename T>
void insertionSort(T arr[],int n){
    for(int i = 1; i < n; i++){
        T e = arr[i]; //设置监视哨
        int j; //j保存元素e应该插入的位置

        //找到应该插入的位置,也就是j的值
        //搜索时,进行后移操作,直到找到插入位置
        for(j = i; j > 0 && arr[j-1] > e; j--)
            arr[j] = arr[j-1]; 

        arr[j] = e;
    }

}
1.3 算法分析
  • 平均时间复杂度:O(n2)
  • 空间复杂度:O(1) (用于记录需要插入的数据)
  • 稳定性:稳定
  • 一些高级算法中常常包含插入算法。
  • 在日常的数据中,一般较少出现完全无序的情况。数据整体上大致按照一定的规律呈现递增或递减规律,这时候选择插入排序就是一个很好的选择。因为插入排序的代码简单,空间复杂度低,同时在这类数据排序中,与高级算法速度相差无几。当然插入算法毕竟还是一种基础算法,在处理大数量级的数据时,速度还是远远低于高级算法的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值