常见排序算法c++实现

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_33278461/article/details/80738912