仅作记录,若有错误指正修改,谢谢。
#include<iostream>
#include<vector>
class solution {
public:
template<class T>
void swap(T &a, T &b) {
T tmp = a;
a = b;
b = tmp;
}
void Bullbesort(vector<int>& nums) {
if (nums.size() <= 1)return;
bool is_swap;
for (int i = 0; i < nums.size()-1;i++){
is_swap = false;
for (int j = 0; j < nums.size() - i - 1;j++) {
if (nums[j] > nums[j + 1]) {
swap(nums[j],nums[j+1]);
is_swap = true;
}
}
if (!is_swap) break;
}
}
void Insertsort(vector<int>& nums){
if (nums.size() <= 1)return;
for (int i = 0; i < nums.size(); i++) {
for (int j = i; j > 0 && nums[j] < nums[j - 1];j--) {
swap(nums[j], nums[j - 1]);
}
}
}
void Selectsort(vector<int>& nums) {
if (nums.size() <= 1)return;
int mid;
for (int i = 0; i < nums.size()-1; i++) {
mid = i;
for (int j = i; j < nums.size();j++) {
if (nums[j] < nums[i])
mid=j;
}
swap(nums[mid], nums[i]);
}
}
//快排
void Quicksort(vector<int>& nums,int l,int r) {
if (l+1>=r)return;//数组越界
int first = l, last = r - 1, key = nums[first];
while (first < last) {
while (first < last && nums[last] >= key) --last;//右指针 从右向左扫描 将?于piv的放到左边
nums[first] = nums[last];
while (first < last && nums[first] <= key) ++first;//左指针 从左向右扫描 将?于piv的放到右边
nums[last] = nums[first];
}
nums[first] = key;//更新pivot
Quicksort(nums, 0,first);
Quicksort(nums, first + 1, r);//递归排序 //以L为中间值,分左右两部分递归调?
}
void mergecount(vector<int>& nums,int l,int mid,int r) {
vector<int> tmp;
int b1 = l,e1=mid,b2=mid+1,e2=r;
while (b1 <= e1 && b2 <= e2) {
if (nums[b1] < nums[b2]) {
tmp.emplace_back(nums[b1]);
++b1;
}
else {
tmp.emplace_back(nums[b2]);
++b2;
}
}
while (b1 <=e1) {
tmp.emplace_back(nums[b1++]);
}
while (b2 <=e2) {
tmp.emplace_back(nums[b2++]);
}
for (int p = 0; p < tmp.size(); ++p) {
nums[l + p] = tmp[p];
}
tmp.clear();
}
void mergesort(vector<int>& nums,int l,int r) {
if (l >= r)return;
int mid = l + (r - l) / 2;
mergesort(nums, l, mid);
mergesort(nums, mid + 1, r);
mergecount(nums,l,mid,r);
}
};
int main(){
vector<int> num1 = { 1,6,5,4,3,2 };
vector<int> num2 = { 1,6,5,4,3,2 };
vector<int> num3 = { 1,6,5,4,3,2 };
vector<int> num4 = { 1,6,5,4,3,2 };
vector<int> num5 = { 1,6,5,4,3,2 };
solution a;
a.Bullbesort(num1); //冒泡排序
cout << "num1:";
for (int i = 0; i < num1.size(); i++) {
cout << num1[i] << ' ';
}
cout << endl;
a.Insertsort(num2); //插入排序
cout << "num2:";
for (int i = 0; i < num2.size(); i++) {
cout << num2[i] << ' ';
}
cout << endl;
a.Selectsort(num3); //选择排序
cout << "num3:";
for (int i = 0; i < num3.size(); i++) {
cout << num3[i] << ' ';
}
cout << endl;
a.Quicksort(num4, 0, num4.size());//快排
cout << "num4:";
for (int i = 0; i < num4.size(); i++) {
cout << num4[i] << ' ';
}
cout << endl;
a.mergesort(num5, 0, num5.size()-1); //归并排序
cout << "num5:";
for (int i = 0; i < num5.size(); i++) {
cout << num5[i] << ' ';
}
cout << endl;
return 0;
}