#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;voidbubblesort(vector<int>& num){
int n = num.size();if(n <2)return;//for (int i = n-1; i >= 0; --i)for(int i =0; i < n;++i){
bool ifswap =false;//for (int j = 0; j < i; ++j)for(int j =0; j < n - i -1;++j){if(num[j]> num[j+1]){swap(num[j], num[j+1]);
ifswap =true;}}if(!ifswap)return;}}
int main(){
vector<int> nums ={44,3,38,5,47,15,36,26,27,2,46,4,19,50,48};bubblesort(nums);for(int i =0; i < nums.size();++i){
cout << nums[i]<<" ";}return0;}
递归
选择排序
迭代
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;voidselectsort(vector<int>& num){
int n = num.size();for(int i =0; i < n-1;++i){
int iminpos = i;for(int j = i +1; j < n;++j){if(num[j]< num[iminpos]){
iminpos = j;}}if(iminpos != i)swap(num[i], num[iminpos]);}}
int main(){
vector<int> nums ={44,3,38,5,47,15,36,26,27,2,46,4,19,50,48};selectsort(nums);for(int i =0; i < nums.size();++i){
cout << nums[i]<<" ";}return0;}
递归
插入排序
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;voidinsertsort(vector<int>& num){
int n = num.size();if(n <2)return;for(int i =1; i < n;++i){
int itmp = num[i];
int j;for(j = i-1; j >=0;--j){if(num[j]<= num[j +1])break;swap(num[j], num[j +1]);//if (num[j] <= itmp) break;//num[j + 1] = num[j];}//num[j + 1] = itmp;}}
int main(){
vector<int> nums ={44,3,38,5,47,15,36,26,27,2,46,4,19,50,48};insertsort(nums);for(int i =0; i < nums.size();++i){
cout << nums[i]<<" ";}return0;}
希尔排序
快速排序(递归)
代码实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;voidquicksort(vector<int>& num, int start, int end){if(start >= end)return;
int l = start;
int r = end;
int key = num[l];while(l < r){while(l < r && num[r]> key) r--;if(l < r) num[l++]= num[r];while(l < r && num[l]<= key) l++;if(l < r) num[r--]= num[l];}
num[l]= key;quicksort(num, start, l -1);quicksort(num, l+1, end);}
int main(){
vector<int> nums ={44,3,38,5,47,15,36,26,27,2,46,4,19,50,48};quicksort(nums,0, nums.size()-1);for(int i =0; i < nums.size();++i){
cout << nums[i]<<" ";}return0;}
215. 数组中的第K个最大元素
classSolution{private:
int partition(vector<int>& nums, int start, int end){
int i =rand()%(end - start +1)+ start;swap(nums[i], nums[end]);
int itmp = nums[end];
int p1 = start -1;for(int p2 = start; p2<end;++p2){if(nums[p2]< nums[end]){swap(nums[++p1], nums[p2]);}}swap(nums[++p1], nums[end]);return p1;}public:
int findKthLargest(vector<int>& nums, int k){
int target = nums.size()- k;
int start =0, end = nums.size()-1;
int index =partition(nums, start, end);while(index != target){if(index > target){
end = index -1;}else{
start = index +1;}
index =partition(nums, start, end);}return nums[index];}};
归并排序
迭代
递归
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;voidmergesort(vector<int>& num, vector<int>& tmp, int start, int end){if(start >= end)return;
int mid = start +(end - start)/2;
int istart1 = start, iend1 = mid;
int istart2 = mid +1, iend2 = end;mergesort(num, tmp, istart1, iend1);mergesort(num, tmp, istart2, iend2);
int ii = start;while(istart1 <= iend1 && istart2 <= iend2)
tmp[ii++]= num[istart1]< num[istart2]? num[istart1++]: num[istart2++];while(istart1 <= iend1)
tmp[ii++]= num[istart1++];while(istart2 <= iend2)
tmp[ii++]= num[istart2++];for(ii = start; ii <= end;++ii){
num[ii]= tmp[ii];}}
int main(){
vector<int> nums ={44,3,38,5,47,15,36,26,27,2,46,4,19,50,48};
vector<int>dataTmp(nums.size());mergesort(nums, dataTmp,0, nums.size()-1);for(int i =0; i < nums.size();++i){
cout << nums[i]<<" ";}return0;}