选择排序(Selection-Sort)
先把最小的拿出来
剩下的, 再把最小的拿出来
剩下的, 再把最小的拿出来
。。。
每次选择还没处理的元素里最小的元素
选择排序就是重复“从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换”这一操作的算法。在序列中寻找最小值时使用的是线性查找。
比如: 对数字1~9进行排序。 使用线性查找在数据中寻找最小值,于是我们找到了最小值 1
插入排序
每次处理一张牌, 把这张牌插入到前面已经排好序的牌中
插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据陆续归位,而右侧留下的就是还未被排序的数据。插人排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插人到已排序区域内合适的位置上。
//
// Created by Eric Li on 2022/1/17.
//
#ifndef JINLOU_MYARRAYPRACTICE_H
#define JINLOU_MYARRAYPRACTICE_H
void printArray(int arr[], int len);
void generateArray(int arr[], int len, int min, int max);
int getArrayMax(int arr[], int len);
int getArraySum(int arr[], int len);
void bubbleSort(int arr[], int len);
void selectSort(int arr[], int len);
void insertSort(int arr[], int len);
void reverse(int arr[], int len);
int linearSearch(int arr[], int len, int target);
int binarySearch(int arr[], int len, int target);
#endif //JINLOU_MYARRAYPRACTICE_H
cpp
#include "myArrayPractice.h"
#include <iostream>
using namespace std;
// 编写打印数组的函数
void printArray(int arr[], int len){
cout<< "[";
for (int i = 0; i < len; i++) {
if (i==len-1)
cout<<arr[i] << "]" <<endl;
else
cout<< arr[i] << ", ";
}
}
// 生成随机数组函数
void generateArray(int arr[], int len, int min, int max){
// 设置随机种子
srand((unsigned int)time(NULL));
// 一般性:rand() % (b-a+1)+ a ; 就表示 a~b 之间的一个随机整数。
for (int i = 0; i < len; i++) {
arr[i] = rand()%(max-min+1) + min;
}
}
int getArrayMax(int arr[], int len){
int max = arr[0];
for (int i = 1; i < len; i++) {
if (arr[i] > max)
max = arr[i];
}
return max;
}
int getArraySum(int arr[], int len){
int sum = 0;
for (int i = 0; i < len; i++) {
sum += arr[i];
}
return sum;
}
// 交换两个数组元素的值
void swap(int a[], int apos, int b[], int bpos){
int temp = a[apos];
a[apos] = b[bpos];
b[bpos] = temp;
}
void bubbleSort(int arr[], int len){
for (int i = 0; i < len; i++) {
for(int j = len -1; j -1 >=i ; j--){
// if(arr[j-1] > arr[j]){
// int temp = arr[j-1];
// arr[j-1] = arr[j];
// arr[j] = temp;
// }
if(arr[j-1] > arr[j])
swap(arr, j-1, arr, j);
}
}
}
void selectSort(int arr[], int len){
for (int i = 0; i < len - 1; i++) {
int minIndex = i;
for (int j = i; j <= len-1; j++) {
if (arr[j] < arr[minIndex])
minIndex = j;
}
// 交换
if (minIndex!=i){
// int temp = arr[minIndex];
// arr[minIndex] = arr[i];
// arr[i] = temp;
swap(arr, minIndex, arr, i);
}
}
}
void insertSort(int arr[], int len){
for (int i = 1; i < len ; i++) {
// 将 i 这张牌插入到合适的位置
for(int j = i; j > 0; j--){
if (arr[j] < arr[j-1])
swap(arr, j, arr, j-1);
else
break; // 此时已经找到合适的位置
}
}
}
void reverse(int arr[], int len){
for(int i = 0;i<len/2;i++){
swap(arr, i, arr, len-i-1);
}
}
int linearSearch(int arr[], int len, int target){
// 返回找到的位置
for(int i = 0;i < len;i++){
if(arr[i]==target)
return i;
}
// 找不返回 -1
return -1;
}
int binarySearch(int arr[], int len, int target){
int left = 0, right = (len -1);
while (left <= right){
int middle = (left + right)/2;
if (arr[middle] == target)
return middle;
else if (arr[middle] > target)
right = middle-1;
else
left = middle +1;
}
return -1;
}
测试文件
#include <iostream>
using namespace std;
#define M 10
#include "myArrayPractice.h"
int main (){
int arr[M];
generateArray(arr, M, 50, 100);
printArray(arr, M);
cout<< "max = "<< getArrayMax(arr, M) <<endl;
cout<< "sum = "<< getArraySum(arr, M) <<endl;
bubbleSort(arr, M);
cout<< "bubbleSort after" <<endl;
printArray(arr, M);
// selectSort(arr, M);
// cout<< "selectSort after" <<endl;
// printArray(arr, M);
// insertSort(arr, M);
// cout<< "insertSort after" <<endl;
// printArray(arr, M);
// 数组元素进行逆序
// reverse(arr, M);
// printArray(arr, M);
// 线性搜索 linear search
int arr2[] = {57, 58, 66, 66, 79, 79, 83, 86, 93, 96};
int index = linearSearch(arr2, M, 58);
cout<< "index = "<< index <<endl;
// 二分搜索 binary search 前提示数组必须有序
int index2 = binarySearch(arr2, M, 58);
cout<< "index2 = "<< index2 <<endl;
return 0;
}