zoukankan      html  css  js  c++  java
  • 常用排序算法总结(二) ---- 插入排序,快速排序

    InsertSort

        通过构建有序序列,对于未排序的数据,在已排序序列中从后向前扫描,找到相应位置插入;在实现上通常采用in-place排序,在从后向前扫描的过程中需要反复把已排序元素逐步后移。

    具体算法描述如下:

    1. 1、从第一个元素开始,该元素可以认为已经被排序
    2. 2、取出下一个元素,在已经排序的元素序列中从后向前扫描
    3. 3、如果该元素(已排序)大于新元素,将该元素移到下一位置
    4. 4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
    5. 5、将新元素插入到该位置后
    6. 6、重复步骤2~5
        如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目 算法的最差时间复杂度为O(n^2),最优为O(n),平均时间复杂度为 O(n^2)。 空间复杂度为O(n),需要辅助空间O(1)

    代码
    /**
     * @author Biang Hoo
     *
     * 2013年9月12日
     */
    public class InsertSort implements Sort{
    
    	@Override
    	public void Sorting(int[] array) {
    		for (int i=1;i<array.length;i++){
    			int tmp = array[i];
    			int key =i;
    			while(key>0 && array[key-1]>tmp){
    					array[key] =array[key-1];
    					key--;
    			
    			}
    			array[key]=tmp;
    		}
    	}
    
    }
    

    QuickSort

       快速排序 (Quicksort)是对冒泡排序 的一种改进。基本思想是:通过一趟排序 将要排序的数据分割 成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归 进行,以此达到整个数据变成有序序列。
            算法描述:      
             1)设置两个变量low 、high, 开始的时候:low=0,high=N-1;
    2)以第一个数组元素作为关键数据,赋值给 key,即 key=A[0];
    3)从high开始向前搜索,即由后开始向前搜索(high -- ),找到第一个小于 key的值A[high],A[low]与A[high]交换;
    4)从low开始向后搜索,即由前开始向后搜索(low++ ),找到第一个大于 key的A[low], A[low]与A[high]交换
            5)重复第3、4、5步,直到low=high;
    快速排序时间复杂度下界为O(nlogn),最坏情况为O(n^2)。在实际应用中,快速排序的平均时间复杂度为O(nlogn)
    代码
    /**
     * @author Biang Hoo
     *
     * 2013年4月12日
     */
    public class QuickSort implements Sort {
    
    	@Override
    	public void Sorting(int[] array) {
    		sort(array,0,array.length-1);
    	}
    	private void sort(int array[],int low,int high){
    		if(low>=high){
    			return;
    		}
    		int index = GetMiddle(array,low,high);
    		sort(array,low,index-1);
    		sort(array,index+1,high);
    	}
    	private int GetMiddle(int[] array,int low,int high) {
    
    		int key = array[low];
    		while(low<high){
    			while(low<high&&array[high]>=key){
    				high--;
    			}
    			array[low] = array[high];
    			while(low<high && array[low]<key){
    				low++;
    			}
    			array[high] = array[low];
    		}
    		array[high] = key;
    		return high;
    	}
    
    }
    


     

  • 相关阅读:
    PHP基础学习笔记(一)
    安装wampserver之后,浏览器中输入localhost页面显示IIS7解决办法
    HTML5常识总结(一)
    AngularJs中的服务
    AngularJs中的directives(指令part1)
    Happy Number——LeetCode
    Binary Tree Zigzag Level Order Traversal——LeetCode
    Construct Binary Tree from Preorder and Inorder Traversal——LeetCode
    Construct Binary Tree from Inorder and Postorder Traversal——LeetCode
    Convert Sorted Array to Binary Search Tree——LeetCode
  • 原文地址:https://www.cnblogs.com/riskyer/p/3331444.html
Copyright © 2011-2022 走看看