插入排序
将每次取到的数插入到排序好的队列中
//插入排序
void InsertSort(vector<int>& nums,int n){
for(int i=0;i<n;i++){
int temp=nums[i];
int j=i-1;
while(j>=0&&nums[j]>temp){
nums[j+1]=nums[j];
j--;
}
nums[j+1]=temp;
}
}
冒泡排序
判断相邻两个数大小,小的数在前,大的在后
//冒泡排序
void BubbleSort(vector<int>& nums,int n){
for(int i=0;i<n;i++){
for(int j=0;j<n-1-i;j++){
if(nums[j]>nums[j+1]){
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
}
简单选择排序
遍历选取最小值放在前面
//简单选择排序
void SelectSort(vector<int>& nums,int n){
for(int i=0;i<n-1;i++){
int min=i;
for(int j=i+1;j<n;j++){
if(nums[min]>nums[j]){
min=j;
}
}
if(min!=i){
int temp=nums[min];
nums[min]=nums[i];
nums[i]=temp;
}
}
}
希尔排序
与插入类似,只是插入的方式是分段插入
//希尔排序
void ShellSort(vector<int>& nums,int n){
int dk,i,j;
for(dk=n/2;dk>0;dk=dk/2){
for(i=dk;i<n;i++){
int temp=nums[i];
for(j=i-dk;j>=0&&nums[j]>temp;j-=dk){
nums[j+dk]=nums[j];
}
nums[j+dk]=temp;
}
}
}
归并排序
分而治之,先保证每段有序,再两两合并
//归并排序
void MergeSortRecursive(vector<int>& nums,int Left,int Right){
if(Left>=Right)return;
int mid=(Left+Right)/2;
MergeSortRecursive(nums,Left,mid);
MergeSortRecursive(nums,mid+1,Right);
Merge(nums,Left,Right,mid);
}
void Merge(vector<int>& nums,int Left,int Right,int mid){
int i=Left,j=mid+1;
vector<int> temp(Right-Left+1);
int k=0;
while(i<=mid&&j<=Right){
if(nums[i]<=nums[j]) temp[k++]=nums[i++];
else if(nums[i]>nums[j]) temp[k++]=nums[j++];
}
while(i<=mid)temp[k++]=nums[i++];
while(j<=Right)temp[k++]=nums[j++];
k=0;
while(Left<=Right)nums[Left++]=temp[k++];
}
快速排序
选取中轴值,比中轴数小的在左,大的在右,再分别对中轴数两侧的数进行同样的操作
//快速排序
void QuictSort(vector<int>& nums,int Left,int Right){
if(Left<Right){
int pivotpos=partition(nums,Left,Right);
QuictSort(nums,Left,pivotpos-1 );
QuictSort(nums,pivotpos+1,Right);
}
}
int partition(vector<int>& nums,int Left,int Right){
int pivot = nums[Left];
while(Left<Right) {
while(Left<Right && nums[Right]>=pivot) Right--;
nums[Left] = nums[Right];
while(Left<Right && nums[Left]<=pivot) Left++;
nums[Right] = nums[Left];
}
nums[Left] = pivot;
return Left;
}