0%

排序算法

各类排序算法及比较

选择排序:

每次选择还未排序的值中最小的一个, 和第一个交换.

思路很清晰, 代码很好写, 时间复杂度为O(n^2).

伪代码:

// 要排序的数组: data[n]
循环i从0到n-1:
    min = 0x7fffffff
    pos = 0
    循环j从i到n-1:
        如果 min > data[j]:
            pos = j
            min = data[j]
    交换data[pos]与data[i]

代码:

int i,j,min,pos,t;
for(i = 0; i < n; ++ i){
    min = 0x7fffffff;
    pos = 0;
    for(j = i; j < n; ++ j){
        if(min > data[j]){
            pos = j;
            min = data[j];
        }
    }
    t = data[i];
    data[i] = data[pos];
    data[pos] = t;
}

冒泡排序

枚举相邻的两个, 如果前者大于后者, 交换.

经过每一轮比较, 最大的一个一定会跑到数组最后面, 就像气泡浮出水面的过程, 因此叫做冒泡排序.

思路简单, 代码好写, 时间复杂度O(n^2).

伪代码:

// 要排序的数组: data[n]
循环i从0到n-2:
    循环j从0到n-i-2:
        如果 data[j] > data[j+1]:
            交换data[j], data[j+1];

代码1:

int i,j,t;
for(i = 0; i < n-1; ++ i){
    for(j = 0; j < n-i-1; ++ j){
        if(data[j] > data[j+1]){
            t = data[j];
            data[j] = data[j+1];
            data[j+1] = t;
        }
    }
}

代码2:

int sorted = 0;
int t = 0;
while( !sorted ){ //当还没排序好
    sorted = 1; //先认为已经排序好
    for( int i = 1; i < n; ++ i ){
        if( data[i - 1] > data[i] ){
            t = data[i - 1];
            data[i - 1] = data[i];
            data[i] = t;
            sorted = false;// 还没排序完毕
        }
    }
    n--; // 最后一位已经排序好, 可以不用管它了
}

借助标志位sorted, 能使得程序在已经排序完毕之后提前退出.

欢迎关注我的其它发布渠道