数组
练习:五只⼩猪称体重 案例描述: 在⼀个数组中记录了五只⼩猪的体重,如: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 轮需要比较 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] << ", ";
}
}