冒泡排序优化

1、冒泡排序从头到尾的扫描,冒泡排序每一次扫描是把前边未排好序的项中最大的项移到后面 。O :n *  n的2开方。

优化1:若前边的项是有序的,方案1依然会做无谓的扫描。可以设置一个boolean的标志位,若上一次进行了交换才进入下一轮扫描。

优化2:若排序中有一段是有序的,也不需要重复的扫描。可以把最后一次交换的位置提出来,下次扫描把这个位置作为最大的扫描位置。

//优化2的实现
int bubble(vector<int>* vector1,int lo,int hi){
    int last= 0;
    while(++lo<hi){
        if((*vector1)[lo] < (*vector1)[lo-1]){
            int temp = (*vector1)[lo];
            (*vector1)[lo] = (*vector1)[lo-1];
            (*vector1)[lo-1] = temp;
            last = lo;
        }
    }
    return last;
}

int main() {
    vector<int> vector1(10);
    vector1[0] = 0;
    vector1[1] = 42;
    vector1[2] = 26;
    vector1[3] = 53;
    vector1[4] = 44;
    vector1[5] = 93;
    vector1[6] = 62;
    vector1[7] = 38;
    vector1[8] = 82;
    vector1[9] = 92;

    int m = vector1.size();
    int lo = 0;
    while (0< (m = bubble(&vector1,lo,m))){

    }

    for (int i = 0; i < vector1.size(); ++i) {
        printf("第%d个元素是%d\n",i,vector1[i]);
    }

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/halo-yang/p/9261235.html