#include<bits/stdc++.h>
using namespace std;
/*
2018.6.18 oder
*/
void swap(int i,int j,vector<int>&nums){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
//1.冒泡排序
vector<int>bubble_sort(vector<int>nums){
for(int i=0;i<nums.size();++i){
int flag=0;//标记用来记录当前循环是否交换了元素,如果没交换就说明已经排好序
for(int j=0;j<nums.size()-i-1;++j){//已经确定位置的就不用遍历了
if(nums[j]>nums[j+1]){
int temp=nums[j+1];
nums[j+1]=nums[j];
nums[j]=temp;
flag=1;
}
}
if(flag==0){
break;
}
}
return nums;
}
//2.鸡尾酒排序
vector<int>cocktail_sort(vector<int>nums){
int left=0;
int right=nums.size()-1;//右面下标是数组长-1
while(left<right){//从左往右遍历
int flag=0;//标记,如果没发生交换则说明已经有序
for(int i=0;i<right;++i){//从左到右遍历
if(nums[i]>nums[i+1]){
swap(i,i+1,nums);
flag=1;
}
}
right--;//最大元素已经放到最右,right--
for(int i=right;i>left;--i){//从右到左遍历
if(nums[i]<nums[i-1]){
swap(i,i-1,nums);
flag=1;
}
}
left++;//最小元素已经放到最左,left++
if(flag==0){
break;
}
}
return nums;
}
//3.简单选择排序
vector<int>selection_sort(vector<int>nums){
for(int i=0;i<nums.size()-1;++i){
int min=i;
for(int j=i+1;j<nums.size();++j){
if(nums[j]<nums[min]){
min=j;
}
}
if(min!=i){
swap(i,min,nums);
}
}
return nums;
}
//4.直接插入排序
vector<int>insertion_sort(vector<int>nums){
for(int i=1;i<nums.size();++i){
int now=nums[i];
int j=i-1;
while(j>=0&&nums[j]>now){//如果大于当前数字,则把后移
nums[j+1]=nums[j];
--j;
}
nums[j+1]=now;
}
return nums;
}
//5.折半插入排序
vector<int> binary_insertion_sort(vector<int>nums){
for(int i=1;i<nums.size();++i){
int left=0;
int right=i-1;
int now =nums[i];
while(left<=right){//找到要插入的位置
int mid=(left+right)/2;
if(nums[mid]>now){
right=mid-1;
}else{
left=mid+1;
}
}
for(int j=i-1;j>=left;--j){//把要插入位置后和之后所有数向后移动一位
nums[j+1]=nums[j];
}
nums[left]=now;
}
return nums;
}
//6.快速排序
int partition(int left,int right,vector<int>&nums){
int pivot =nums[right];
while(left<right){
while(left<right&&nums[left]<=pivot){//从左往右找大于中心元素的
++left;
}
swap(left,right,nums);
while(left<right&&nums[right]>=pivot){//从右往左找小于中心元素的
--right;
}
swap(left,right,nums);
}
return left;
}
void quick_sort(int left,int right,vector<int>&nums){
if(left>=right){
return;
}
int pivot_index=partition(left,right,nums);//找中间元素索引
quick_sort(left,pivot_index-1,nums);//左半部分快排
quick_sort(pivot_index+1,right,nums);//右半部分快排
}
//7.希尔排序,就是分组直接插入,元素之间的距离是gap而不再是1
vector<int>shell_sort(vector<int>nums){
for(int gap=nums.size()/2;gap>=1;gap/=2){//分组距离每次除2
for(int i=gap;i<nums.size();++i){
int j=i;
while(j-gap>=0&&nums[j]<nums[j-gap]){
swap(j,j-gap,nums);
j=j-gap;
}
}
}
return nums;
}
int main(){
int n;
//cin>>n;//n number;7 3 4 1 9 6 2 5 8
vector<int>nums={7,3,4,1,9,6,2,5,8};
vector<int>res;
/*while(n--){
int now;
cin>>now;
nums.push_back(now);
} */
//res=Bubble_Sort(nums);
//res=Cocktail_sort(nums);
//res= selection_sort(nums);
//res=insertion_sort(nums);
/*quick_sort(0,nums.size()-1,nums);
res=nums;*/
res=binary_insertion_sort(nums);
//res=shell_sort(nums);
for(int i=0;i<nums.size();++i){
cout<<res[i]<<" ";
}
cout<<endl;
return 0;
}
常见排序算法c++实现
猜你喜欢
转载自blog.csdn.net/qq_33278461/article/details/80738912
今日推荐
周排行