zoukankan      html  css  js  c++  java
  • 【C++】归并排序实现

    基本过程

    采用分治的核心思想,把一个复杂问题拆成若干子问题求解。
    通过递归的方法,不断对左右两部分进行拆分
    比较左右两部分大小,不断将左右两部分按顺序合并

    代码实现

    #include<iostream>
    #include<vector>
    
    using namespace std;
    
    void merge(vector<int>& nums, int low, int mid, int high);//声明
    
    void sort(vector<int>& a, int low, int high) {
    	if (low >= high) return;//看是否只剩最后一个元素了
    	int mid = low + (high - low) / 2;//把数组分成左右两半
    	sort(a, low, mid);//与下一句一起,递归地把数组左右两半排好序
    	sort(a, mid + 1, high);
    	merge(a, low, mid, high);//把排好序的数组合并起来
    }
    
    void merge(vector<int> &nums, int low, int mid, int high) {
    	vector<int> copy(nums);//后面会修改原数组
    	int k = low, i = low, j = mid + 1;//k表示从什么位置开始修改原来的数组,i表示左半边的起始位置,j表示右半边的起始位置
    
    	while (k <= high) {
    		if (i > mid) {//左半边的数都处理完毕了,只剩右半边的数。只需把右边的数逐个拷贝上去就行了
    			nums[k++] = copy[j++];
    		}
    		else if (j > high) {//右半边的数都处理完毕了,只剩左半边的数。只需把左边的数逐个拷贝上去就行了
    			nums[k++] = copy[i++];
    		}
    		else if (copy[j] < copy[i]) {//右边的数小于左边的数,将右边的数拷贝上去一个
    			nums[k++] = copy[j++];
    		}
    		else {//左边的数小于右边的数,将左边的数拷贝上去一个
    			nums[k++] = copy[i++];
    		}
    	}
    }
    
    //打印数组
    void printVector(const vector<int>& a) {
    	for (auto i : a) {
    		cout << i << " ";
    	}
    	cout << endl;
    }
    
    int main(int argc, char** argv) {
    	vector<int> a{ 5,6,4,2,3 };
    	sort(a,0,a.size()-1);
    	printVector(a);
    
    	return 0;
    }
    
  • 相关阅读:
    Wix Burn:如何将32位和64位的安装包制作成一个安装包
    禁止32位安装包运行在64位操作系统上
    图片校验码
    Oracle建表命令
    npm系列
    git使用
    syslog
    hibernate配置enum枚举属性
    httpClient发送post请求
    修改ubuntu系统语言
  • 原文地址:https://www.cnblogs.com/dindin1995/p/13059106.html
Copyright © 2011-2022 走看看