• 插入排序和归并排序


    本人在CSDN的原链接http://blog.csdn.net/fonxian/article/details/46604517

    一、插入排序

    首先是插入排序,这个过程就可以比喻成左手放牌(已排好序),右手抓牌(牌堆上最顶端的一张牌),然后放到左手,插到正确的位置

    1、伪代码

    for j = 2 to A.length
    	key = A[j];
    	i = j - 1;
    	while(i >0&&a[i]<key)
    		a[i+1] = a[i];
    		i --;
    	a[i+1] = key;
    		 
    

    2、可用代码

    void insert(int a[],int n){
    	int key;
    	int i;
    	for (int j = 2; j <= n; j++){
    		key = a[j];
    		i = j - 1;
    		while (i>0 && key < a[i]){
    			a[i + 1] = a[i];
    			i--;
    		}
    		a[i + 1] = key;
    	}
    }
    

    3、算法复杂度分析

    空间复杂度为O(1),最好的情况是O(n),最差的情况是O(n^2)
    算法稳定性:记录的相对在排序的过程中保持不变,排序前i在j之前(i<j),排序的过程中i始终在j之前。排序算法是否为稳定的是由具体算法决定的。
    直接插入算法是稳定性算法。

    二、归并排序

    1、算法思想

    归并排序主要用到了分治的思想。假设一个数组中的n个数,假设为10,逻辑上分成两组,即a[0]-a[4]为A组,a[5]-a[10]为B组,且A组和B组各自都是排序好的数,我们首先在每组中取出第一个数比较,即(a[0]和a[5]比较大小,若a[0]小,则将a[0]插入到临时数组temp[]中,接着a[1]再和a[5]比较大小,小的一方还是放到临时数组中)。完成合并之后,再使用递归的思想,将10个数的排序分治成每一个数字,即两个数比较大小之后合并成一组,一组两个数和另外一组的两个数合并到一组中,依次类推。

    2、算法实现

    public static void merge(int array[],int left,int mid,int right){
    		int[] temp = new int[right-left+1];
    		int i = left,j = mid+1,k = 0;
    		
    		//将一个数组通过下标分成逻辑上的两组数,比较两组数A,B,数小的放到临时数组
    		while(i<=mid&&j<=right){
    			if(array[i]<array[j])
    				temp[k++]=array[i++];
    			else{
    				temp[k++]=array[j++];
    			}
    		}
    		
    		//考虑到A或B数组中的数绝大多数都比另外一个数组小,则另一个数组可能会剩下一部分排好序的数
    		//将剩下的数放入到数组
    		while(i<=mid)
    			temp[k++] = array[i++];
    		while(j<=right)
    			temp[k++] = array[j++];
    		//将整个临时表放到原数组中
    		for(int n = 0,len=temp.length;n<len;n++){
    			array[n+left] = temp[n];
    		}
    		
    	}
    	
    	//使用到递归的思想,最小会细分到一个数为一组
    	//然后二个数比较大小后合并成一组一组就有两个数依次类推
    	public static void merge_sort(int[] array, int left, int right){
    	    int mid;
    	    if (left < right){
    	         mid = (left + right) / 2;
    	        merge_sort(array, left, mid);
    	        merge_sort(array, mid + 1, right);
    	        merge(array, left, mid, right);
    
    	    }
    	}
    	
    	public static void main(String[] args) {
    		int array[] = {20,15,47,20,13,100,1};
    		merge_sort(array,0,array.length-1);
    		System.out.println(Arrays.toString(array));
    	}
    
    

    3、算法复杂度分析

    空间复杂度为O(1),最好的情况是O(nlgn),最差的情况是O(nlgn),是稳定的排序

  • 相关阅读:
    09-JS的事件流的概念(重点)
    08-jQuery的位置信息
    07-小米导航案例
    python-selector模块
    python--day9--异步IO、数据库、队列、缓存
    python--select多路复用socket
    python--gevent高并发socket
    python--协程
    python--进程锁、进程池
    python--多进程
  • 原文地址:https://www.cnblogs.com/fonxian/p/5493965.html
Copyright © 2020-2023  润新知