排序1-冒泡排序

排序1-冒泡排序


冒泡排序的次数是递减的, 第一次确定了最大元素的位置, 所以第二次只需要进行n-1次排列, 第二次确定了第二大元素的位置, 所以第三次只需要进行n-2次排列, 以此类推

for (int i = 0; i < len; i++){
        //每次遍历的次数是递减的
        //所以j=len-1-i
        for (int j = 0; j < len-1-i; j++){
            if(arr[j]>arr[j+1])
                Swap(&arr[j], &arr[j+1]);
        }

交换元素位置

//交换
void Swap(int *a, int *b){
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

冒泡排序

//冒泡排序
void BubbleSort(int arr[]){
    int len = MAX;
    for (int i = 0; i < len; i++){
        for (int j = 0; j < len-1-i; j++){
            if(arr[j]>arr[j+1])
                Swap(&arr[j], &arr[j+1]);
        }
    }
}

打印

//打印数组
void PrintArray(int arr[]){
    int len = MAX;
    for (int i = 0; i < len; i++){
        cout << arr[i] << " ";
    }
    cout << endl;    
}

测试

int main(){
    int arr[MAX];
    srand((unsigned int)time(NULL));
    for (int i = 0; i < MAX; i++){
        arr[i] = rand() % MAX;
    }

    cout << "排序前: ";
    PrintArray(arr);

    BubbleSort(arr);

    cout << "排序后: ";
    PrintArray(arr);

    system("pause");
    return 0;
}


优化

在一次排序中如果没有元素交换, 说明每一个元素都比它前一个元素大(正序), 此时排序已经完成, 可以提前终止排序.

int flag = 0; //0表示false, 标志没有排序好
//冒泡排序
void BubbleSort(int arr[]){
    int len = MAX;
    for (int i = 0; i<len && flag==0; i++){
        flag = 1; //认为已经排序好了
        for (int j = 0; j < len-1-i; j++){ 
            if(arr[j]>arr[j+1]){//有元素比它前一个元素小时触发
                flag = 0; //将排序标志更新为没有排序好
                Swap(&arr[j], &arr[j+1]);
            }
        }
    }
}

posted @ 2024-04-21 21:27  HIK4RU44  阅读(13)  评论(0)    收藏  举报