C++实现排序算法

快速排序

    int partition(vector<int>& arr,int left,int right)
    {
    
    
        int tmp=arr[left];
        while(left<right)
        {
    
    
            //先从右面开始
            while(left< right&&arr[right]>=tmp)
            {
    
    
                right--;
            }
            arr[left]=arr[right]  ;
            //此时arr[right]<tmp;
            while(left<right && arr[left]<=tmp)
            {
    
    
                left++;
            }
            //此时arr[left]>=tmp
            arr[right]=arr[left];
        }
        arr[left]=tmp;
        return left;//  此时left和right相等
    }
    
    void QuickSort(vector<int>&arr,int left,int right)
    {
    
    
        int shaft=partition(arr,left,right);
        if(shaft-1>left)
        {
    
    
            QuickSort(arr,left,shaft-1);
        }
        if(shaft+1<right)
        {
    
    
             QuickSort(arr,shaft+1,right);
        }
    }
    vector<int> MySort(vector<int>& arr) {
    
    
        // write code here
        int left=0;
        int right=arr.size()-1;
        QuickSort(arr, left, right);
        return arr;
    }

插入排序

    vector<int> MySort(vector<int>& arr) {
    
    
        // write code here
        //插入排序:思想是一次遍历,但是每次使已扫描部分排好序
        //分别用i,j来完成
        int tmp;
        int len=arr.size();
        for(int i=1;i<len;i++)
        {
    
    
            tmp=arr[i];
            int j=i-1;
            while(j>=0 && arr[j] >tmp)
            {
    
    
                arr[j+1]=arr[j];
                j--;
            }
            //此时arr[j0<arr[i]]
            arr[j+1]=tmp;
        }
        return  arr;
    }

希尔排序

希尔排序和选择排序类似

    vector<int> MySort(vector<int>& arr) {
    
    
        // write code here
        //希尔排序
        int len=arr.size();
        for(int gap=len/2;gap>0;gap/=2)
        {
    
    
            for(int i=gap;i<len;i++)
            {
    
    
                int tmp=arr[i];
                int j=i-gap;
                while(j>=0 && arr[j]>tmp )
                {
    
    
                    arr[j+gap]=arr[j];
                    j-=gap;
                }
                arr[j+gap]=tmp;
            }
        }
        return arr;

选择排序

思路:
1.在未排序的情况下找到最小元素,放到排序的后面。
2.找到最小元素,如果不是未排序的首元素,则进行交换。

二路归并排序

思路:
1.每两两一组归并,排序

    void Sort(vector<int>&arr,int gap)
    {
    
    
        vector<int> assist(arr.size(),0);
        int index=0;
        int start1=0;
        int end1=start1+gap-1;
        int start2=end1+1;
        int end2=start2+gap-1>arr.size()-1?arr.size()-1:start2+gap-1;
        
        while(start2<arr.size())     //保证有两路,也就是有第二组的存在;
        {
    
    
            while(start1<=end1 && start2<=end2)
            {
    
    
                if(arr[start1]<arr[start2])
                {
    
    
                    assist[index++]=arr[start1++];
                }
                else
                {
    
    
                    assist[index++]=arr[start2++];
                }
            }
            //
            while(start1<=end1)
            {
    
    
                assist[index++]=arr[start1++];
            }
            while(start2<=end2)
            {
    
    
                assist[index++]=arr[start2++];
            }
            //更新
            start1=end2+1;
            end1=start1+gap-1;
            start2=end1+1;
            end2=start2+gap-1>arr.size()-1?arr.size()-1:start2+gap-1;
        }
        
        while(start1<arr.size())     //只有第一组
        {
    
    
            assist[index++]=arr[start1++];
        }
        for(int i=0;i<arr.size();i++)    //往回复制回去
        {
    
    
            arr[i]=assist[i];
        }
        
    }
    vector<int> MySort(vector<int>& arr) {
    
    
        // write code here
        //二路归并
        for(int gap=1;gap<arr.size();gap*=2)
        {
    
    
            Sort(arr,gap);
        }
        return arr;
    }
};

猜你喜欢

转载自blog.csdn.net/ALITAAAA/article/details/115066541