时间复杂度+选择排序+冒泡排序 + 插入排序
时间复杂度:
常数操作的指标;
评论一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样板的实际运行时间,也就是“常数项时间”
举例:位运算和乘法运算
举例:
看、比较、交换 = 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;
}

浙公网安备 33010602011771号