各种排序算法

Posted aliencxl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各种排序算法相关的知识,希望对你有一定的参考价值。

快速排序:

 void QuickSort(vector<int>& nums, int lo, int hi){
        if(lo < hi){
            int p = partition(nums,lo,hi);
            QuickSort(nums,lo,p-1);
            QuickSort(nums,p+1,hi);
        }
    }
    int partition(vector<int>& nums, int lo, int hi){
        int pivot = nums[lo];
        while(lo < hi){
            while( lo < hi && nums[hi] > pivot) --hi;
            nums[lo] = nums[hi];//小的放左边
            while( lo <hi && nums[lo] <= pivot) ++lo;
            nums[hi] = nums[lo];//大的放右边
        }
        nums[lo] = pivot;//pivot放中间
        return lo;
    }

插入排序

void InsertSort(vector<int>& nums){
        int n = nums.size();
        for(int i = 1; i< n; i++){
            int t = nums[i];//先取出nums[i]
            int j = i;
            while( j > 0 && nums[j-1] > t){
                nums[j] = nums[j-1];
                j--;
            }
            //找到正确的位置
            nums[j] = t;
        }
    }

shell排序

 void ShellSort(vector<int>& nums){
        int n = nums.size();
        for(int k = n/2; k >= 1; k/=2){
            // InsertSort
            for(int i = k; i < n; i++){
                int t = nums[i];
                int j = i;
                while(j - k >= 0 && nums[j-k] > t){
                    nums[j] = nums[j-k];
                    j -= k;
                }
                nums[j] = t;
            }
        }
    }

归并排序:没有做空间优化

 void merge(vector<int>& nums,int lo, int hi){
        int mid = (lo+hi)/2;
        vector<int> temp;
        int i = lo, j = mid+1;
        while(i <= mid && j <= hi){
            if(nums[i] <= nums[j]) temp.push_back(nums[i++]);
            else temp.push_back(nums[j++]);
        }
        while(i <= mid) temp.push_back(nums[i++]);
        while(j <= hi) temp.push_back(nums[j++]);
        for(int i = lo; i <= hi; i++)
            nums[i] = temp[i-lo];
    }
    void MergeSort(vector<int>& nums, int lo, int hi){
        if(lo >= hi) return;
        int mid = (lo + hi)/2;
        MergeSort(nums,lo,mid);
        MergeSort(nums,mid+1,hi);
        merge(nums,lo,hi);
    }

堆排序

void percdown(vector<int>& nums, int n, int index){
        int t = nums[index];// 先取出index处的值
        int pa = index, chi;
        while(pa*2+1 < n){
            chi = pa*2 + 1;
            if(chi != n-1 && nums[chi] <nums[chi+1])
                chi++;
            if(t >= nums[chi]) break;//找到了正确的位置
            nums[pa] = nums[chi];
            pa = chi;//
        }
        nums[pa] = t;//把t放在正确的位置上
    }
    void HeapSort(vector<int>& nums){
        int n = nums.size();
        //建堆
        for(int i = n/2-1; i >= 0; i--)
            percdown(nums,n,i);
        for(int i = n-1; i >= 1; i--){
            //把最大的放在最后
            swap(nums[0],nums[i]);
            //调整交换后这个值的位置
            percdown(nums,i,0);
        }
    }

 

以上是关于各种排序算法的主要内容,如果未能解决你的问题,请参考以下文章

各种排序算法整理(附带习题及代码)

Java排序算法 - 堆排序的代码

程序员面试必问系列——各种排序算法比较

用Python实现各种排序算法

各种排序算法练习

各种排序算法性能比较