排序算法C++

1.插入排序:

vector<int> sortArray(vector<int>& nums) {    
        if(nums.size()==1)return nums;
        int len=nums.size();
        for(int i=1;i<len;++i){
            int temp=nums[i];
            int compare=i-1;
            while(compare>=0&&temp<nums[compare]){
                nums[compare+1]=nums[compare];
                compare--;
            }
            nums[compare+1]=temp;
        }
        return nums;
    }

2. 冒泡排序

vector<int> sortArray(vector<int>& nums) {  
        if(nums.size()==1)return nums;
        int len=nums.size();
        for(int i=0;i<len-1;++i){
            for(int j=len-1;j>i;--j){
                if(nums[j-1]>nums[j]){
                    int temp=nums[j-1];
                    nums[j-1]=nums[j];
                    nums[j]=temp;
                }
            }
        }
        return nums;
    }

3. 归并排序

 vector<int> sortArray(vector<int>& nums) {//归并排序
        mergesort(nums,0,nums.size()-1);
       return nums;
    }
   void mergesort(vector<int>&nums,int l,int r){
       if(l<r){
            int m=l+(r-l)/2;
            mergesort(nums,l,m);
            mergesort(nums,m+1,r);
            merge(nums,l,m,m+1,r);
       }
   }
    void merge(vector<int>&nums, int L1,int R1,int L2,int R2){
        int temp[R2-L1+1];
        int i=L1;
        int j=L2;
        int k=0;
        while(i<=R1&&j<=R2){
            if(nums[i]<nums[j])
                temp[k++]=nums[i++];
            else 
                temp[k++]=nums[j++];
        }
        while(i<=R1) temp[k++]=nums[i++];
        while(j<=R2) temp[k++]=nums[j++];
        for(int i=0;i<k;i++)
            nums[L1+i]=temp[i];
    }

4. 快速排序

int partition(vector<int>&nums,int low,int high){
        int temp=nums[high];
        while(low<high){
            
            while(low<high&&nums[low]<=temp)low++;
            nums[high]=nums[low];
            while(low<high&&nums[high]>=temp)high--;
            nums[low]=nums[high];
        }
        nums[high]=temp;
        return high;
    }
    void quicksort(vector<int>&nums,int low,int high){
        if(low<high){
            int pos=partition(nums,low,high);
            quicksort(nums,low,pos-1);
            quicksort(nums,pos+1,high);
        }
    }
   vector<int> sortArray(vector<int>& nums) {
         quicksort(nums,0,nums.size()-1);
       return nums;
    }

5. 希尔排序

void shellsort(vector<int>& nums,int n){
        for(int dk=n/2;dk>0;dk/=2){
            for(int i=dk;i<n;++i){
                 for (int j = i; j - dk >= 0 && nums[j - dk] > nums[j]; j -= dk) {
                    swap(nums[j - dk], nums[j]);
                     }
                    
                }
            }
        }
    
    vector<int> sortArray(vector<int>& nums) {
         shellsort( nums,nums.size());
        return nums;
    }
  1. 桶排序
vector<int> bucketsort(vector<int>& nums) {
         if (nums.size()==0)return {};
        int low=*min_element(nums.begin(),nums.end());
        int high=*max_element(nums.begin(),nums.end());
        int len=high-low+1;
        vector<int>bucket(len);
        for(auto temp:nums)bucket[temp-low]++;
        vector<int>res;
        for(int i=0;i<len;++i){
            for(int j=0;j<bucket[i];j++){
                res.push_back(i+low);
            }
        }
        return res;
    }
  1. 堆排序
 void adjust(vector<int>&nums,int len,int index){//维护稳定堆
        int left=2*index+1;
        int right=2*index+2;
        int max=index;
        if(left<len&&nums[left]>nums[max])max=left;
        if(right<len&&nums[right]>nums[max])max=right;
        if(max!=index){
            swap(nums[max],nums[index]);
            adjust(nums,len,max);
        }
    }
void HeapSort(vector<int> &nums, int size){//顶端和末端值交换
	  for(int i=size/2 - 1; i >= 0; i--){
	       adjust(nums, size, i);
	   }
	    for(int i = size - 1; i >= 1; i--){
	           swap(nums[0], nums[i]);        
	           adjust(nums, i, 0);              
	       }
	   }
vector<int> sortArray(vector<int>& nums) {
      HeapSort(nums, nums.size());
      return nums;
  		}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值