码迷,mamicode.com
首页 > 编程语言 > 详细

各种排序算法

时间:2020-06-24 21:26:07      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:span   while   amp   堆排   调整   col   中间   --   最大的   

快速排序:

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

 

各种排序算法

标签:span   while   amp   堆排   调整   col   中间   --   最大的   

原文地址:https://www.cnblogs.com/Aliencxl/p/13189917.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!