• 排序算法的c++实现


    #include<iostream>
    #include<vector>
    using namespace std;
    
    void bubbleSort(vector<int>& nums){
      int size = nums.size();
      for (int p=size-1;p>=0;p--){ //每轮循环将p处元素就位
        int flag = 0;              // 退出标记
        for (int i=0;i<p;i++){     // 访问至p-1处元素
          if(nums[i]>nums[i+1]){   //严格大于,稳定
            swap(nums[i], nums[i+1]);
            flag = 1;
          }
        }
        if (flag==0) break;
      }
      return;
    }
    
    void insertionSort(vector<int> &nums){
      int size = nums.size();
      for (int p=1;p<=size-1;p++){
        int tmp = nums[p];
        int i;
        for (i=p;i>0 &&nums[i-1]>tmp ;i--) nums[i] = nums[i-1];
        nums[i] = tmp;
      }
      return;
    }
    
    void originalShellSort(vector<int> &nums){
      int size = nums.size();
      for (int D=size/2;D>0;D/=2){
        for (int p=D;p<=size-D;p+=D){
          int tmp = nums[p];
          int i;
          for (i=p;i>=D && nums[i-D]>tmp; i-=D){//i>=D因为插排中的i>0实际上是i>=1
            nums[i] = nums[i-D];
          }
          nums[i] = tmp;
        }
      }
    }
    
    //归并排序递归版
    void merge(vector<int> &nums, int left, int mid, int right){
      // 优化:不在每次merge处申请tmp,而在最外面统一申请,反复使用
      int* tmp = new int[right-left+1]; //申请新的数组空间
      int p1 = left, p2 = mid, pc = 0;
      while(p1<=mid-1&&p2<=right){
        if (nums[p1]<nums[p2]) tmp[pc++] = nums[p1++];
        else tmp[pc++] = nums[p2++];
      }
      while(p1<=mid-1) tmp[pc++] = nums[p1++];
      while(p2<=right) tmp[pc++] = nums[p2++];
      // 这里倒着把tmp中的元素放入nums中
      for (int i=right-left;i>=0;i--) nums[right--] = tmp[i];
      delete[] tmp;//释放申请的空间
    }
    
    void mergeSort1(vector<int> &nums, int left, int right){
      if (left<right){ //left==right时,只有一个元素,返回即可
          int mid = left+(right-left)/2;
          mergeSort1(nums, left, mid);   //此时坐标已经排序好
          mergeSort1(nums, mid+1, right);//此时右边已经排序好
          merge(nums, left, mid+1, right);//合并两个排序好的序列
      }
    }
    
    // 归并排序迭代版
    void mergeSort2(vector<int> &nums, int left, int right){
      int size = nums.size();
    
    
    }
    // 归并排序总接口
    void mergeSort(vector<int>& nums){
      mergeSort1(nums, 0, nums.size()-1);
    }
    
    // 快速排序
    int median3(vector<int> &nums, int left, int right){
      int mid = left+(right-left)/2;
      if (nums[left]>nums[mid]) swap(nums[left], nums[mid]);
      if (nums[left]>nums[right]) swap(nums[left], nums[right]);
      if (nums[mid]>nums[right]) swap(nums[mid], nums[right]);
      //此时三处元素顺序已经排好
      swap(nums[mid], nums[right-1]);
      return nums[right-1];
    
    }
    int partition(vector<int> &nums, int left, int right){
      // cout<<1;
      int pivot = median3(nums, left, right);
      // for (auto num:nums) cout<<num;
      // cout<<endl;
      int p1=left, p2 = right-1;
      while(true){
        // cout<<p1;
        while(nums[++p1]<pivot);
        while(nums[--p2]>pivot);
        if (p1<p2) swap(nums[p1], nums[p2]);
        else break;
      }
      swap(nums[p1],nums[right-1]);
      // cout<<2;
      return p1;
    }
    void quickSortCore(vector<int> &nums, int left, int right){
      // cout<<left<<right<<endl;
      if (left==right) return; //补丁1
      if (right-left+1>3)
        {int ready = partition(nums, left, right);
        // for (auto num:nums) cout<<num;
        // cout<<endl;
        quickSortCore(nums,left,ready-1);
        quickSortCore(nums,ready+1,right);
        return;}
      //left right区间小的时候,上述代码处理边界有点问题
      else median3(nums,left,right); //补丁2 长度<=3再找中位数就有点问题了
    }
    void quickSort(vector<int> &nums){
      quickSortCore(nums,0,nums.size()-1);
      return;
    }
    
    int main(){
      // 中位数时 2 2 6
      vector<int> nums = {2,4,1,5,6,7,3,2,5,6,8,4,2,5,6};
      vector<int> nums2 = {2,4,1,5,6,7,3,2,5,6,8,4,2,5,6};
      quickSort(nums);
      insertionSort(nums2);
      for (auto num:nums) cout<<num;
      cout<<endl;
      for (auto num:nums2) cout<<num;
      return 0;
    }
  • 相关阅读:
    派遣函数
    英文论文(1)
    状态机和时序图的“前世姻缘”
    线程安全性:原子性,安全性,加锁机制
    多线程程序中操作的原子性
    win10下安装Centos7总笔记!
    分支限界法---旅行售货员问题
    PHP+ajax聊天室源码!支持长轮循跟定时请求两种
    elasticsearch配置优化
    hbase region与内存的关系
  • 原文地址:https://www.cnblogs.com/cry-star/p/12427915.html
Copyright © 2020-2023  润新知