C++day05光速入门指南--数组和冒泡排序/选择排序

数组

练习:五只⼩猪称体重 案例描述: 在⼀个数组中记录了五只⼩猪的体重,如:int arr[5] = {300,350,200,400,250}; 找出并打印最重的⼩猪体重。

int main(){
    // 五只小猪称重 谁最重
    // 就是求数组中的最大值
    int arr[6] = {300,350,200,400,250, 200};
    int maxWeight = arr[0]; // 假设第一只猪最重
    for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i) {
        if (arr[i] > maxWeight)
            maxWeight = arr[i]; // 更新最重的
    }
    cout << "maxWeight = " <<maxWeight <<endl;

}

  • 数组元素逆置 案例描述:请声明⼀个5个元素的数组,并且将元素逆置. (如原数组元素为:1,3,2,5,4;逆置后输出结果为:4,5,2,3,1);
#include <iostream>
#include<cmath>
using namespace std;
int main(){
    // 交换两个变量
//    int a = 100;
//    int b = 300;
//    int temp;
//    temp = a;
//    a = b;
//    b = temp;
//    cout<< a<< endl;
//    cout<< b<< endl;
    int arr[] = {1, 3, 5, 2, 4, 29, 47, 33};
    int len = sizeof(arr)/sizeof(arr[0]);
    int temp;

    for (int i = 0; i < len/2 ;i++) {
        temp = arr[i];
        arr[i] = arr[len-1-i];
        arr[len-1-i] =temp;
    }
    for (int i = 0; i < len ;i++) {
       cout<< arr[i] << "  ";
    }


}

2

#include <iostream>
#include<cmath>
using namespace std;
int main(){

    int arr[] = {1, 3, 5, 2, 4, 29, 47, 33};
    int len = sizeof(arr)/sizeof(arr[0]);
    for(int min=0, max=len-1; min<=max;max--, min++){
        int temp = arr[min];
        arr[min] = arr[max];
        arr[max] = temp;
    }
    for (int i = 0; i < len ;i++) {
       cout<< arr[i] << "  ";
    }
}

冒泡排序

冒泡排序就是重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字
的位置”这一操作的算法。在这个过程中,数字会像泡泡一样,慢慢从右往左“浮”到序列的
顶端,所以这个算法才被称为“冒泡排序”。

    1. 比较相邻元素, 如果第一个比第二个大, 就交换他们两个
    1. 对每一对相邻的元素做同样的工作, 执行完毕后, 找到第一个最大值
    1. 重复以上步骤, 每次比较 次数 - 1, 直到不需要比较









在冒泡排序中,第 1 轮需要比较 n -1 次,第 2 轮需要比较 n -2 次……第 n -1 轮需
要比较 1 次。因此,总的比较次数为 (n -1) +(n -2) +…+1 ≈ n^2
/2。这个比较次数恒定为该数值,和输入数据的排列顺序无关。
不过,交换数字的次数和输入数据的排列顺序有关。假设出现某种极端情况,如输
入数据正好以从小到大的顺序排列,那么便不需要任何交换操作;反过来,输入数据要
是以从大到小的顺序排列,那么每次比较数字后便都要进行交换。因此,冒泡排序的时
间复杂度为 O(n^2)。
一层循环/右侧开始版

#include <iostream>
using namespace std;
int main(){
    int arr[] = {5, 9, 3, 1, 2, 8, 4, 7, 6};
    int len = sizeof(arr)/sizeof(arr[0]);
    for (int j = len-1; j > 0; --j) {
        if (arr[j-1] > arr[j]){
            int temp = arr[j-1];
            arr[j-1] = arr[j];
            arr[j] = temp;
        }
    }
    for (int i = 0; i < len; ++i) {
        cout<< arr[i] << "\t";
    }
    cout<< endl;
    cout<< "================================" << endl;

    for (int j = len-1; j > 1; --j) {
        if (arr[j-1] > arr[j]){
            int temp = arr[j-1];
            arr[j-1] = arr[j];
            arr[j] = temp;
        }
    }
    for (int i = 0; i < len; ++i) {
        cout<< arr[i] << "\t";
    }
    cout<< endl;
    cout<< "================================" << endl;


    for (int j = len-1; j > 2; --j) {
        if (arr[j-1] > arr[j]){
            int temp = arr[j-1];
            arr[j-1] = arr[j];
            arr[j] = temp;
        }
    }
    for (int i = 0; i < len; ++i) {
        cout<< arr[i] << "\t";
    }
    cout<< endl;
    cout<< "================================" << endl;

    for (int j = len-1; j > 3; --j) {
        if (arr[j-1] > arr[j]){
            int temp = arr[j-1];
            arr[j-1] = arr[j];
            arr[j] = temp;
        }
    }
    for (int i = 0; i < len; ++i) {
        cout<< arr[i] << "\t";
    }
    cout<< endl;
    cout<< "================================" << endl;

    for (int j = len-1; j > 4; --j) {
        if (arr[j-1] > arr[j]){
            int temp = arr[j-1];
            arr[j-1] = arr[j];
            arr[j] = temp;
        }
    }
    for (int i = 0; i < len; ++i) {
        cout<< arr[i] << "\t";
    }
    cout<< endl;
    cout<< "================================" << endl;

    for (int j = len-1; j > 5; --j) {
        if (arr[j-1] > arr[j]){
            int temp = arr[j-1];
            arr[j-1] = arr[j];
            arr[j] = temp;
        }
    }
    for (int i = 0; i < len; ++i) {
        cout<< arr[i] << "\t";
    }
    cout<< endl;
    cout<< "================================" << endl;
    for (int j = len-1; j > 7; --j) {
        if (arr[j-1] > arr[j]){
            int temp = arr[j-1];
            arr[j-1] = arr[j];
            arr[j] = temp;
        }
    }
    for (int i = 0; i < len; ++i) {
        cout<< arr[i] << "\t";
    }
    cout<< endl;
    cout<< "================================" << endl;
}


在这里插入图片描述


#include <iostream>
using namespace std;
int main(){
    int arr[] = {5, 9, 3, 1, 2, 8, 4, 7, 6};
    int count = 0;
    int len = sizeof(arr)/sizeof(arr[0]);
    for (int i = 0; i < len -1; ++i) {
        for (int j = len-1; j > i; --j) {
            count++;
            if (arr[j-1] > arr[j]){
                int temp = arr[j-1];
                arr[j-1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    for (int i = 0; i < len; ++i) {
        cout<< arr[i] << "\t";
    }
    cout<< endl;
    cout<<  count << endl;
}

左侧开始版

#include <iostream>
using namespace std;

int main(){
    int arr[] = { 4,2,8,0,5,7,9, 1,3 };
    int len = sizeof(arr)/sizeof(arr[0]);
    // len-1-i 每次最右面的值是最大的,不用比较
    for (int i = 0; i < len-1; ++i) {
        for (int j = 0; j < len-1-i; ++j) {
            if (arr[j] > arr[j+1]){
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }

    for (int i = 0; i < len; ++i) {
        cout << arr[i]<< "\t";
    }
}

选择排序(Selection-Sort)

先把最小的拿出来
剩下的, 再把最小的拿出来
剩下的, 再把最小的拿出来
。。。
每次选择还没处理的元素里最小的元素

选择排序就是重复“从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换”这一操作的算法。在序列中寻找最小值时使用的是线性查找。

比如: 对数字1~9进行排序。 使用线性查找在数据中寻找最小值,于是我们找到了最小值 1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 一层版
#include <iostream>
using namespace std;
int main(){
    int arr[] = {6, 1, 7, 8, 9, 3, 5, 4, 2};
    int  len = sizeof(arr)/sizeof(arr[0]);
    int minIndex = 0;
    for (int j = 0; j < len; ++j) {
        if (arr[j] < arr[minIndex])
            minIndex = j;
    }
    cout<<"minIndex = "<< minIndex <<endl;
    // 交换
    int temp = arr[0];
    arr[0] = arr[minIndex];
    arr[minIndex] = temp;
    for (int i = 0; i < len; ++i)
        cout<<arr[i]<<"\t";
    cout<<endl;
    cout<<"-------------------------------"<<endl;
    cout<<"-------------------------------"<<endl;
    minIndex = 1;
    for (int j = 1; j < len; ++j) {
        if (arr[j] < arr[minIndex])
            minIndex = j;
    }
    cout<<"minIndex = "<< minIndex <<endl;
    // 交换
    temp = arr[1];
    arr[1] = arr[minIndex];
    arr[minIndex] = temp;
    for (int i = 0; i < len; ++i)
        cout<<arr[i]<<"\t";
    cout<<endl;
    cout<<"-------------------------------"<<endl;
    cout<<"-------------------------------"<<endl;

    minIndex = 2;
    for (int j = 2; j < len; ++j) {
        if (arr[j] < arr[minIndex])
            minIndex = j;
    }
    cout<<"minIndex = "<< minIndex <<endl;
    // 交换
    temp = arr[2];
    arr[2] = arr[minIndex];
    arr[minIndex] = temp;
    for (int i = 0; i < len; ++i)
        cout<<arr[i]<<"\t";
    cout<<endl;
    cout<<"-------------------------------"<<endl;
    cout<<"-------------------------------"<<endl;

}

在这里插入图片描述

最终版

#include <iostream>
using namespace std;

int main(){
    int arr[] = { 6, 1, 7, 8, 9, 3, 5, 4, 2};
    int len = sizeof(arr)/sizeof(arr[0]);

    for (int i = 0; i < len - 1; ++i) {
        int minIndex = i;
        for (int j = i; j < len; ++j) {
            if(arr[j] < arr[minIndex])
                minIndex = j;
        }
        // 小优化
        if (minIndex != i){
            int temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }

    for (int i = 0; i < len; ++i) {
        cout << arr[i] <<"\t";

    }
    cout <<endl;





}

在这里插入图片描述

插入排序

在这里插入图片描述
每次处理一张牌, 把这张牌插入到前面已经排好序的牌中
插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。插人排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插人到已排序区域内合适的位置上。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;
// 冒泡排序
void insertionSort(int arr[], int len);
void printArray(int array[], int len);

int main (){
    int arr[] = {5, 9, 3, 1, 2, 8, 4, 7, 6};
    cout<< "insertionSort排序前" <<endl;
    printArray(arr, 8);
    cout<< "insertionSort排序后" <<endl;
    insertionSort(arr, 8);
    printArray(arr, 8);
    return 0;
}
void insertionSort(int arr[], int len){
//    写法1
//    for (int i = 1; i < len; i++) {
//        // 将 i 位置的值 插入到合适的位置
//        for (int j = i; j > 0; j--) {
//            if (arr[j] < arr[j-1]){
//                int temp = arr[j];
//                arr[j] = arr[j-1];
//                arr[j-1] = temp;
//            } else{
//                break; //此时就是合适的插入位置
//            }
//        }
//    }

    // 写法2
    for (int i = 1; i < len; i++) {
        // 将 i 位置的值 插入到合适的位置
        for (int j = i; j > 0 && arr[j] < arr[j-1]; j--) {
            int temp = arr[j];
            arr[j] = arr[j-1];
            arr[j-1] = temp;
        }
    }
}

void printArray(int array[], int len){
    cout<<"[";
    for (int i = 0; i < len; i++) {
        if (i == len-1)
            cout<< array[i] <<"]"<<endl;
        else
            cout<<array[i] << ", ";
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值