• 《算法三》(归并排序)


    分治思想:分而治之
    归并排序:递归的拆分+合并
      合并:两个有序数组合并为一个有序数组
      1.准备临时数组
      2.将数据元素依序放到临时数组中
      3.将数据元素从临时数组拷贝回到原数组中,释放临时数组

    代码演示:

    #include<iostream>
    #include<vector>
    #include<string.h>
    #define NUM 10
    
    void print_art(int* a, int len){
    	for(int i=0; i<len; i++){
    		printf("%d ", a[i]);
    	}
    	printf("
    ");
    } 
    
    //合并函数
    //有序数组1:L~M  有序数组2:M+1~R 
    void merge_sort(int* a, int L, int M, int R){
    	//合并函数三步走:
    	//1.准备临时数组
    	//2.将数据元素依序放到临时数组中
    	//3.将数据元素从临时数组拷贝回到原数组中,释放临时数组
    	
    	int len = R - L + 1;//临时数组大小 
    	int* temp = new int[len];//临时数组
    	int k = 0;//临时数组下标 
    	int left = L;//数组1起始位置下标 
    	int right = M+1;//数组2起始位置下标  
    	
    	while(left<=M && right<=R){
    		if(a[left] < a[right]){
    			temp[k++] = a[left++];
    		}else{
    			temp[k++] = a[right++];
    		}
    	}
    	while(left<=M){//如果数组1还有剩余 
    		temp[k++] = a[left++];
    	}
    	while(right<=R){//如果数组2还有剩余 
    		temp[k++] = a[right++];
    	}
    	
    	//重点:memcpy时候应该放a+L位置 
    	memcpy(a+L, temp, sizeof(int)*len);
    	
    	delete[] temp;
    	temp = NULL;
    }
    	  
    //归并排序 
    void mergesort(int* a, int L, int R){
    	if( L==R ) return ;
    	int m = L + (R - L ) / 2;
    	mergesort(a, L, m);//拆分左边 
    	mergesort(a, m+1, R);//拆分右边 
    	merge_sort(a, L, m, R);//左右两边合并 
    } 
    	  
    	  
    int main(){
    	int a[NUM] = {1, 3, 5, 7, 9, 0, 2, 4, 6, 8};
    	mergesort(a, 0, 9);
    	merge_sort(a, 0, 4, 9); 
    	print_art(a, NUM);
    	return 0;
    }
    

     代码重点:memcpy时候应该放a+L位置 

          memcpy(a+L, temp, sizeof(int)*len);

    memcpy函数:

        void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字符到存储区 str1

  • 相关阅读:
    android:versionCode和android:versionName 用途
    ProgressDialog使用总结
    对 Android 开发者有益的 40 条优化建议
    Android TextView换行问题
    Android TextView自动换行文字排版参差不齐的原因
    Python 生成requirement 使用requirements.txt
    PLSQL简介
    python魔法方法详解
    深入了解Token认证的来龙去脉
    数组、链表、栈、队列和STL
  • 原文地址:https://www.cnblogs.com/Whgy/p/12284625.html
Copyright © 2020-2023  润新知