快速排序
找基准数,大数放右边,小数放左边,递归排序
从后往前找小数,从前往后找大数
#include<iostream>
#include<vector>
#include<algorithm>
void quicksort(vector<int>&nums,int low,int high){
int i=low,j=high;
int temp=nums[low];
while(i<j){
while(nums[j]<temp&&i<j) j--;
if(i<j)
nums[i++]=nums[j];
while(nums[i]<temp&&i<j) i++;
if(i<j)
nums[j--]=nums[i];
}
nums[i]=temp;
quicksort(nums,low,i-1);
quicksort(nums,i+1,high);
}
冒泡排序
#include<iostream>
#include<vector>
using namespace std;
void BubbleSort(vector<int>&nums,int n){
for(int i=0;i<nums.size()-1;i++){
for(int j=0;j<nums.size()-i-1;j++){
if(nums[j]>nums[j+1]){
swap(nums[j],nums[j+1]);
}
}
}
}
选择排序
#include<iostream>
#include<vector>
using namespace std;
void SelectSort(vector<int>&nums,int n){
for(int i=0;i<n;i++){
int res=i;
for(int j=i+1;j<n;j++){
if(nums[j]<nums[res])
res=j;
}
swap(nums[i],nums[res]);
}
}
插入排序
#include<iostream>
#include<vector>
using namespace std;
void InsertSort(vector<int>&nums){
int temp;
for(int i=0;i<nums.size();i++){
int j=i+1;
temp=nums[i];
while(temp<nums[j]&&j>=0){
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}
}
堆排序
步骤一:建立大根堆–将n个元素组成的无序序列构建一个大根堆,
步骤二:交换堆元素–交换堆尾元素和堆首元素,使堆尾元素为最大元素;
步骤三:重建大根堆–将前n-1个元素组成的无序序列调整为大根堆
#include<iostream>
#include<vector>
void adjust(vector<int>& arr,int len,int index){
int left=2*index+1;//左孩子节点
int right=2*index+2;//右孩子结点
int maxindex=index;
//判断左右子树结点是否大于当前的非叶子节点,若是,则记录下标
if(left<len&&arr[left]>arr[maxindex]) maxindex=left;
if(right<len&&arr[right]>arr[maxindex]) maxindex=right;
//交换非帖子结点和记录的下标的值
if(maxindex!=index){
swap(arr[maxindex],arr[index]);
//递归调整成大堆
adjust(arr,len,maxindex);
}
}
void heapSort(vector<int>& arr,int size){
for(int i=size/2-1;i>=0;i--){
//找到第一个非叶子节点,将其调整成大堆
adjust(arr,size,i);
}
for(int i=0;i<size;i++){
//
swap(arr[0],arr[i]);
adjust(arr,i,0);
}
}