算法基础2—冒泡排序和选择排序

一、冒泡排序
冒泡排序是最慢的排序算法之一,但也是最容易实现的排序算法。
之所以叫冒泡排序是因为它使用这种排序算法时,数值会像气泡一样从数组一端漂浮到另一端。假设正在将一组数字按照升序排列,较大的值会浮动在数组的右侧,而较小的值则会浮动在数组的左侧。
之所以会产生这样的现象是因为算法会多次在数组中移动,比较相邻的数据,当左侧值大于右侧值时,将它们进行互换。
总之冒泡排序就是相邻两个元素比较,满足交换条件就进行交换的过程。
下面先给出c语言的代码(很久之前写的,中间还带有一点小小的优化哦)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[100005];
int main()
{
    int n, swap;
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    /*
         在a[0]到a[n-1]的范围内,一次比较两个相邻元素的值,若a[j]>a[j+1],则交换;
         经过这样一趟冒泡,就把这N个数中最大的数放到a[n-1]中。 
    */ 
    for(int i = 0; i < n-1; i++)
    {
        swap = 0;
        for(int j = 0; j < n - 1 - i; j++)
        {
            if(a[j] > a[j+1])
            {
                swap = 1;
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
        if(!swap) break;
    }
    for(int i = 0; i < n; i++)
    {
        printf("%d", a[i]);
    }
    return 0;
 } 

再给出一个今天写的JS代码:

var bubbleSort = function(a){  //其中a为待排序数组
    var len = a.length;
    for(var i = len; i >= 2; i --)
    {
        for(var j = 0; j <= i-1; j ++)
        {
            if(a[j] <= a[j+1])
            {
                var temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
    return a;
}

时间复杂度分析:很显然的冒泡排序的时间复杂度为O(n^2)。
二、选择排序
选择排序的主要过程就是从数组的开头开始,将第一个元素和其他元素进行比较,检查完所有元素后,最小的元素会被放到数组的第一个位置,然后算法会从第二个位置继续。这个过程一直执行,当进行到数组的倒数第二个位置时,所有的数据便完成了排序。
下面给出js代码:

var selectSort = function(a){
    var min, temp;
    for(var i = 0; i < a.length-1; i++)        //n-1
    {
        min = i;
        for(var j = i+1; j < a.length; j++)    //n-1
        {
            if(a[j] < a[i])
            {
                min = j;
            }
        }
        temp = a[i];
        a[i] = a[min];
        a[min] = temp;
    }
    return a;
}

很显然的时间复杂度为O(n^2)。

谢谢!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值