时间复杂度+选择排序+冒泡排序 + 插入排序

时间复杂度:
常数操作的指标;
评论一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样板的实际运行时间,也就是“常数项时间”
举例:位运算和乘法运算

举例:
看、比较、交换 = aN^2 + bN+C
时间复杂度:只要高阶项,而且去掉高阶项系数 == O(N^2)

选择排序SelectSort和冒泡排BubbleSort:
时间复杂度O(N^2),空间复杂度O(N^2);
冒泡排序:每次先比较,再交换,每次循环确定一位(最大值&最小值)
选择排序:先找到一个最大(小)值,然后依次进行比较,每轮循环找到一个最大(小)值的下标,然后再进行交换;
// 冒泡排序代码实现
#include <iostream>

using namespace std;

void swap(int& a,int& b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}

// 3 5 2 1 7 9
// 3 5 2 1 7 9
// 3 5 2 1 7 9
// 3 5 2 1 7 9
/*
  冒泡排序:每次先比较,再交换,每次循环确定一位(最大值&最小值)

*/
//正序排序
void BubbleSort(int arr[],int size)
{
    for(int i = 0; i < size - 1; i++){
        for(int j = 0; j < size - 1 - i; j++){
            if(arr[j] > arr[j+1]){
                swap(arr[j],arr[j+1]);
            }
        }
    }
}

// 倒序排序
void BubbleSort(int arr[],int size)
{
    for(int i = size - 1; i > 0; i--){
        for(int j = size - 1; j > size - 1 - i; j--){
            if(arr[j-1] < arr[j]){
                swap(arr[j-1],arr[j]);
            }
        }
    }
}


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

    // 打印数组
    for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++){
        cout << arr[i] << endl;
    }

    return 0;
}

// 选择排序代码实现
#include <iostream>

using namespace std;

void swap(int& a,int& b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}

/*
    3, 2,  5, 7, 1, 8,9,2,4
    3, 2,  5, 7, 1, 8,9,2,4
    选择排序:先找到一个最大(小)值,然后依次进行比较,每轮循环找到一个最大(小)值的下标,然后再进行交换;
*/
//正序排列
void SelectSort(int arr[],int size)
{
    for(int i = 0; i < size - 1; i++){
        // 记录最小值的下标
        int minIndex = i;
        for(int j = i; j < size-1; j++){
            if(arr[minIndex] > arr[j + 1]){
                minIndex = j+1;
            }
        }

        // 交换
        if(i != minIndex){
            swap(arr[i],arr[minIndex]);
        }  
    }
}

// 倒序排列
void SelectSort(int arr[],int size)
{
    for(int i = 0; i < size - 1; i++){

        // 记录最大值的下标
        int maxIndex = i;
        for(int j = i; j < size-1; j++){
            if(arr[maxIndex] < arr[j + 1]){
                maxIndex = j+1;
            }
        }

        // 交换
        if(i != maxIndex){
            swap(arr[i],arr[maxIndex]);
        }  
    }
}

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

    SelectSort(arr,sizeof(arr)/sizeof(arr[0]));

    for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++){
        cout << arr[i] << endl;
    }

    return 0;
}
异或:
1、无进位相加:
2、支持交换和结合,跟异或顺序无关
0^N=N
N^N=0
两个值交换:
a=a^b;
b=a^b;
c=a^b;

一种数出现奇数次:int eor = 0; 异或整个数组
两种数出现奇数次:int eor = a^b; 

一个数最右侧的1提取出来:
int a = eor & (~eor + 1);
/*
 * @Description: 
 * @Author: whl
 * @博客园: https://www.cnblogs.com/cnwhl/
 * @Date: 2021-12-28 10:54:05
 * @LastEditTime: 2021-12-28 16:43:11
 */

#include <iostream>
using namespace std;

/**
 * @description: 一个数组中只有1个数,出现奇数次,其它都出现偶数次,找出这个数字
 * @param {int} arr 数组
 * @param {int} size 数组大小
 * @return 无
 */
void findOnly(int arr[],int size)
{
    int eor = 0;
    
    for(int i = 0; i < size; i++){
        eor = eor^arr[i];
    }

    cout << eor << endl;
}

/**
 * @description: 一个数组中有2个数,出现奇数次,其它都出现偶数次,找出这两个数字
 * @param {int} arr 数组
 * @param {int} size 数组大小
 * @return 无
 */
void findTwo(int arr[],int size)
{
    int ab = 0;
    int bit = 0;
    int a = 0;

    for(int i = 0; i < size; i++){
        ab ^= arr[i];
    }

    // 提取最后一位不同的位数
    bit = ab & (~ab + 1);

    for(int i = 0; i < size; i++){
        if(bit & arr[i]){
            a ^= arr[i];
        }
    }
    
    cout << a << " vs " << (a^ab) << endl;
}

int main()
{
    int arr1[] = {1,2,3,2,1,1,2,3,3,1,2,7,7,7};
    int arr2[] = {1,2,3,2,1,1,2,3,3,1,2,7,7,7};

    findOnly(arr1,sizeof(arr1)/sizeof(arr1[0]));
    findTwo(arr2,sizeof(arr2)/sizeof(arr2[0]));

    return 0;
}

插入排序:
/*
 * @Description: 
 * @Author: whl
 * @博客园: https://www.cnblogs.com/cnwhl/
 * @Date: 2021-12-28 10:54:05
 * @LastEditTime: 2021-12-28 17:13:08
 */

#include <iostream>

using namespace std;


/**
 * @description: 两个数字的值交换
 * @param {int&} a
 * @param {int&} b
 * @return {*}
 */
void swap(int& a,int& b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}

/**
 * @description: 插入排序
 * @Remark: 正序排序
 * @param {int} arr 要排序的数组
 * @param {int} size 数组大小
 * @return {*}
 */
void InsertSort(int arr[],int size)
{
    for(int i = 1; i < size; i++){
        for(int j = i; j > 0 ; j--){

            if(arr[j - 1] < arr[j]){
                break;
            }
            swap(arr[j - 1], arr[j]);
        }
    }
}

/**
 * @description: 插入排序
 * @Remark: 倒序排序
 * @param {int} arr 要排序的数组
 * @param {int} size 数组大小
 * @return {*}
 */
void InsertSort(int arr[],int size)
{
    for(int i = 1; i < size; i++){
        for(int j = i; j > 0 ; j--){

            if(arr[j - 1] > arr[j]){
                break;
            }
            swap(arr[j - 1], arr[j]);
        }
    }
}

int main()
{
    int arr[] = {5,7,9,3,4,5,2,1};

    InsertSort(arr,sizeof(arr)/sizeof(arr[0]));

    for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++){
        cout << arr[i] << endl;
    }

    return 0;
}




posted @ 2021-12-28 17:22  sfwhl  阅读(132)  评论(0)    收藏  举报