直接插入排序
#include<bits/stdc++.h>
using namespace std;
void Insertsort(vector<int>& nums,int n){
for(int i=2;i<=n;i++){ //默认第一个数字有序
int j;
nums[0]=nums[i]; //复制哨兵
for(j=i-1;nums[j]>nums[0];j--){ //往前查找插入位置,边插边将数字后移
nums[j+1]=nums[j];
}
nums[j+1]=nums[0]; //找到插入位置
}
}
int main(){
int n;
cin>>n; //表示有n个整数需要参与排序
vector<int>nums(n+1);
for(int i=1;i<=n;i++) //输入数据
scanf("%d",&nums[i]);
Insertsort(nums,n); //插入排序
for(int i=1;i<=n;i++) //输入数据
printf("%d ",nums[i]);
}
希尔排序
#include<bits/stdc++.h>
using namespace std;
void ShellInsert(vector<int>& nums,int n,int d){
for(int i=d+1;i<=n;i+=d){ //每次增长增量d
nums[0]=nums[i]; //复制哨兵
int j;
//相当于一个变相的直接插入排序(d=1)
for(j=i-d;j>0&&nums[j]>nums[0];j-=d) //注意要增加判断j>0
nums[j+d]=nums[j];
nums[j+d]=nums[0]; //找到插入位置
}
}
void ShellSort(vector<int>& nums,int n){ //划分子序列
for(int d=n/2;d>=1;d/=2) //计算增量
ShellInsert(nums,n,d); //按增量d进行排序
}
int main(){
int n;
cin>>n; //表示有n个整数需要参与排序
vector<int>nums(n+1);
for(int i=1;i<=n;i++) //输入数据
scanf("%d",&nums[i]);
ShellSort(nums,n); //希尔排序,先划分子序列
for(int i=1;i<=n;i++) //输入数据
printf("%d ",nums[i]);
}
简单选择排序
#include<bits/stdc++.h>
using namespace std;
void SelectInsert(vector<int>& nums,int n){
int minIndex; //保存最小值的下标
for(int i=0;i<n;i++){ //按从小到大排序,每一次选出以一个最小值
minIndex=i; //初始赋值为i
for(int j=i+1;j<n;j++){
if(nums[j]<nums[minIndex])
minIndex=j; //更新最小值下标
}
swap(nums[minIndex],nums[i]); //将选出来的最下值交换到前面
}
}
int main(){
int n;
cin>>n; //表示有n个整数需要参与排序
vector<int>nums(n);
for(int i=0;i<n;i++) //输入数据
scanf("%d",&nums[i]);
SelectInsert(nums,n);
for(int i=0;i<n;i++) //输入数据
printf("%d ",nums[i]);
}
堆排序
#include<bits/stdc++.h>
using namespace std;
void HeapAdjust(vector<int>& nums,int n,int cur){ //对堆进行调整
nums[0]=nums[cur]; //暂存顶点,对该顶点进行堆调整
for(int i=2*cur;i<=n;i*=2){ //类似于完全二叉树的性质,跟孩子进行比较
if(i<n&&nums[i]<nums[i+1]) i++; //从左右孩子中选取较大的那个进行比较
if(nums[0]>=nums[i]) break; //如果当前顶点符合大跟堆的要求,则无需调整
else{ //如果自己的我孩子大于自己
nums[cur]=nums[i]; //与较大的孩子进行交换
cur=i; //调整后的新孩子堆不一定满足堆的要求,可能需要继续调整
}
}
nums[cur]=nums[0]; //找到最终符合整个堆的调整位置
}
void HeapSort(vector<int>& nums,int n){ //建堆
for(int i=n/2;i>0;i--){ //先把数组建立成大根堆
HeapAdjust(nums,n,i);
}
for(int i=n;i>1;i--){
swap(nums[i],nums[1]); //将调整好的堆的最后一个元素与第一个元素交换,即把最大的数排序到最后,代表确定一个数的最终位置
HeapAdjust(nums,i-1,1); //重新对【1,i-1】的堆进行调整
}
}
int main(){
int n;
cin>>n; //表示有n个整数需要参与排序
vector<int>nums(n+1);
for(int i=1;i<=n;i++) //输入数据
scanf("%d",&nums[i]);
HeapSort(nums,n); //堆排序
for(int i=1;i<=n;i++) //输入数据
printf("%d ",nums[i]);
}
冒泡排序
#include<bits/stdc++.h>
using namespace std;
void BubbleSort(vector<int>& nums,int n){
for(int i=0;i<n-1;i++){ //一共进行n-1轮排序,前n-1个确定后,最后一个自然就确定了
for(int j=0;j<n-1;j++){
if(nums[j]>nums[j+1]) swap(nums[j],nums[j+1]);
}
}
}
int main(){
int n;
cin>>n; //表示有n个整数需要参与排序
vector<int>nums(n+1);
for(int i=0;i<n;i++) //输入数据
scanf("%d",&nums[i]);
BubbleSort(nums,n); //冒泡排序
for(int i=0;i<n;i++) //输入数据
printf("%d ",nums[i]);
}
快速排序
#include<bits/stdc++.h>
using namespace std;
void QuickSort(vector<int>& nums,int left,int right){ //遵循左闭右闭原则
if(left>=right) return;
int pivot=nums[left]; //以区间最左端元素为中轴
int lcur=left,rcur=right; //确立左右两个指针对区间内元素进行排序交换
while(lcur<rcur){
while(lcur<rcur&&nums[rcur]>=pivot) rcur--; //从右边找到一个小于枢轴的元素
nums[lcur]=nums[rcur]; //将该元素移动到枢轴左边
while(lcur<rcur&&nums[lcur]<=pivot) lcur++; //从左边找到一个大于枢轴的元素
nums[rcur]=nums[lcur]; //将该元素移动到枢轴右边
}
nums[lcur]=pivot; //将枢轴元素放到最终位置
QuickSort(nums,left,lcur-1); //递归排序左半部分
QuickSort(nums,lcur+1,right); //递归排序右半部分
}
int main(){
int n;
cin>>n; //表示有n个整数需要参与排序
vector<int>nums(n+1);
for(int i=0;i<n;i++) //输入数据
scanf("%d",&nums[i]);
QuickSort(nums,0,n-1); //快速排序
for(int i=0;i<n;i++) //输入数据
printf("%d ",nums[i]);
}
归并排序
#include<bits/stdc++.h>
using namespace std;
void MergeSort(vector<int>& nums,vector<int>& tempnums,int left,int right){ //遵循左闭右闭原则
if(left>=right) return;
int mid=(left+right)/2; //从中间划分子序列
MergeSort(nums,tempnums,left,mid);
MergeSort(nums,tempnums,mid+1,right);
for(int i=left;i<=right;i++) tempnums[i]=nums[i]; //使用辅助数组暂存原数组元素
int i=left,j=mid+1,cur;
for(cur=left;i<=mid&&j<=right;cur++){ //开始二路归并
if(tempnums[i]<=tempnums[j]) nums[cur]=tempnums[i++]; //先放小的元素
else nums[cur]=tempnums[j++];
}
while(i<=mid) nums[cur++]=tempnums[i++]; //如果左半边还有剩余元素
while(j<=right) nums[cur++]=tempnums[j++]; //如果右半边还有剩余元素
}
int main(){
int n;
cin>>n; //表示有n个整数需要参与排序
vector<int>nums(n);
vector<int>tempnums(n);
for(int i=0;i<n;i++) //输入数据
scanf("%d",&nums[i]);
MergeSort(nums,tempnums,0,n-1); //冒泡排序
for(int i=0;i<n;i++) //输入数据
printf("%d ",nums[i]);
}