• 排序算法


    1.冒泡排序:

     注意:2,5        如果当前j是5,j-1是2,5比2大,那5和2就不会交换,并且下一次比较的j是2,就不再是5

        void Bubble_Sort(vector<int> input){
            int length = input.size();
            if(length <= 0)
                return;
            bool flag = true;
            for(int i = 0;i < length && flag;i++){
                flag = false;
                for(int j = length - 1;j > i;j--){
                    if(input[j] < input[j-1]){
                        swap(input[j],input[j-1]);
                        flag = true;
                    }
                }
            }
        }

     2.直接插入排序

            void Insert_Sort(vector<int> input){
                int length = input.size();
                if(length <= 0)
                    return;
                int tmp;
                int i,j;
                for(i = 1;i < length;i++){
                    if(input[i] < input[i-1]){
                        tmp = input[i];
                        for(j = i-1;j >= 0 && input[j] > input[i];j--){
                            input[j+1] = input[j];
                        }
                        input[j] = tmp;
                    }
                }
            }

    自己的写法:

    void Insert_Sort(vector<int> input){
                int length = input.size();
                if(length <= 1)
                    return;
                for(int i = 1;i < length;i++){
                    if(input[i] < input[i-1]){
                        for(int j = i-1;j >= 0;j--){
                            if(input[j] <= input[j+1])
                                break;
                            else
                                swap(input[j],input[j+1]);
                        }
                    }
                }
            

    3.选择排序

    以下面5个无序的数据为例:

    56 12 80 91 20

    第1趟:12 56 80 91 20

    第2趟:12 20 80 91 56

    第3趟:12 20 56 91 80

    第4趟:12 20 56 80 91

    void Select_Sort(vector<int> input){
      
    int length = input.size();
      
    if(length <= 0)
        
    return; for(int i = 0;i < length;i++){
        
    int min = i; for(int j = i+1;j < length;j++){
          
    if(input[j] < input[min]){
            min
    = j; } }
        
    if(min != i){
          swap(input[i],input[min]); } }
    }

    4.希尔排序

    http://blog.csdn.net/morewindows/article/details/6668714

            void Shell_Sort(vector<int> input){
                int length = input.size();
                if(length <= 0)
                    return;
                for(int gap = length/2;gap >= 1;gap /= 2){
                    for(int i = 0;i < length;i++){
                        for(int j = i+gap;j < length;j += gap){
                            if(input[j] < input[j-gap]){
                                int tmp = input[j];
                                int k = j-gap;
                                while(k >= 0 && input[k] > tmp){
                                    input[k+gap] = input[k];
                                    k -= gap;
                                }
                                input[k+gap] = tmp;
                            }
                        }
                    }
                }
            }

     5.堆排序

     6.归并排序

    void MergeSort(vector<int> input,int start,int mid,int end){
                vector<int> front;
                vector<int> behind;
                int i,j,k;
                int len1 = mid - start + 1;
                int len2 = end - mid;
                int len3 = end - start + 1;
                for(i = 0;i < len1;i++){
                    front.push_back(input[i]);
                }
                for(j = 0;i < len2;j++){
                    behind.push_back(input[j+mid+1]);
                }
                for(i = 0,j = 0,k = 0;i < len1 && j < len2 && k < len3;k++){
                    if(front[i] < behind[j]){
                        input[k] = front[i];
                        i++;
                    }
                    else{
                        input[k] = behind[j];
                        j++;
                    }
                }
                while(i <= len1){
                    input[k++] = front[i++];
                }
                while(j <= len2){
                    input[k++] = front[j++];
                }
            }
            void Merge(vector<int> input,int start,int end){
                if(start < end){
                    int mid = (strat + end)/2;
                    Merge(input,start,mid);
                    Merge(input,mid+1,end);
                    MergeSort(input,start,mid,end);
                }
            }
            void Sort(vector<int> input){
                int length = input.size();
                if(length <= 0)
                    return;
                Merge(input,0,length-1);
            }

     7.快排

    时间复杂度分析:https://www.cnblogs.com/fengty90/p/3768827.html

    最好和平均:

    最坏时间复杂度:

    partition函数以end为界将数组分为左侧小于end的数值,右侧大于end的数值,并且同时返回end的数值在新数组的坐标值,方便之后分别在左侧和右侧继续排序。

    注意:quick_sort,partition两个函数的vector都需要用引用,不然这个代码就跑不通

    partition时间复杂度是logn,快排时间复杂度是nlogn

    small记录的是最后一个小于比较的数的位置

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    
    class solution{
    public:
        void quick_sort(vector<int> &input,int start,int end){
            if(input.empty())
                return;
            if(start == end)
                return;
            int index = partition(input,start,end);
            if(start < index)
                quick_sort(input,start,index-1);
            if(index < end)
                quick_sort(input,index+1,end);
        }
    
        int partition(vector<int> &input,int start,int end){
    
            int small = start - 1;
            for(int i = start;i < end;i++){
                if(input[i] < input[end]){
                    small++;
                    if(small != i)
                        swap(input,small,i);
                }
            }
            small++;
            swap(input,small,end);
            return small;
        }
    
        void swap(vector<int> &input,int start,int end){
            int tmp = input[start];
            input[start] = input[end];
            input[end] = tmp;
        }
    
    };
    
    
    
    int main(){
    
        vector<int> input(4,1);
        input[1] = 3;
        input[2] = 5;
        input[0] = 2;
        solution a;
        a.quick_sort(input,0,3);
        for(int i = 0;i < 4;i++)
            cout << input[i] << endl;
    }

    自己又写了一个版本:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    class Solution{
    public:
        void quicksort(vector<int>& nums){
            if(nums.empty())
                return;
            int start = 0,end = nums.size() - 1;
            sort(nums,start,end);
        }
    
        void sort(vector<int>& nums,int start,int end){
            if(start == end)
                return;
            int index = partition(nums,start,end);
            if(index > start)
                sort(nums,start,index-1);
            if(index < end)
                sort(nums,index+1,end);
        }
    
        int partition(vector<int>& nums,int start,int end){
            int small = start - 1;
            for(int i = start;i < end;i++){
                if(nums[i] < nums[end]){
                    small++;
                    if(small != i)
                        swap(nums[small],nums[i]);
                }
            }
            small++;
            swap(nums[small],nums[end]);
            return small;
        }
    };
    
    
    
    int main(){
        Solution debug;
        int a[] = {9,2,6,1,5,4,8};
        vector<int> nums(a,a+7);
        debug.quicksort(nums);
        for(int i = 0;i < nums.size();i++){
            cout << nums[i] << " ";
        }
        cout << endl;
    }

  • 相关阅读:
    python中open函数的使用
    内存地址转换与分段【转】
    VirtualBox虚拟机网络设置【转】
    Google免费的公共DNS服务器
    SSH数据交互过程【转】
    适合Web服务器的iptables规则【转】
    使用安装光盘建立本地yum仓库【转】
    RHCE从入门到精通视频教程【转】
    解决Apache启动时错误提示
    50个C/C++源代码网站【转】
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/7622765.html
Copyright © 2020-2023  润新知