zoukankan      html  css  js  c++  java
  • 数据结构之排序算法Java实现(4)—— 交换类排序之快速排序算法

    快速排序算法属于"交换类"的排序,它的效率主要跟数据分布是否对称有关。

    升序排序:

    /**
    	 * 快速排序
    	 * 升序排序
    	 */
    	@Override
    	public <T extends Comparable<? super T>> void sortByAsc(T[] data) {
    		if(data == null || data.length <= 1){
    			return;
    		}
    		partitionSortByAsc(data, 0, data.length - 1);
    	}
    
    	private <T extends Comparable<? super T>> void partitionSortByAsc(T[] data, int low, int high) {
    		if(low >= high){
    			return;
    		}
    		/**使用两个指针 start 和 end*/
    		int start = low;
    		int end = high;
    		T key = data[low];
    		/**找到key的位置,然后将data分成两部分,分别再次进行递归*/
    		while(start < end){
    			while(start < end && data[start].compareTo(key) < 0){
    				start ++ ;
    			}
    			if(data[start].compareTo(key) > 0){
    				T temp = data[start];
    				data[start] = data[end];
    				data[end] = temp;
    			}
    			while(start < end && data[end].compareTo(key) > 0){
    				end -- ;
    			}
    			if(data[end].compareTo(key) <= 0){
    				T temp = data[end];
    				data[end] = data[start];
    				data[start] = temp;
    			}
    		}
    		/**左边的*/
    		if(start > low) partitionSortByAsc(data,low,start - 1);
    		/**右边的*/
    		if(end < high) partitionSortByAsc(data,end + 1, high);
    		
    		
    	}
    

      降序排序:

    /**
    	 * 快速排序
    	 * 降序排序
    	 */
    
    	@Override
    	public <T extends Comparable<? super T>> void sortByDesc(T[] data) {
    		partitionSortByDesc(data, 0, data.length - 1);
    		
    	}
    
    	private <T extends Comparable<? super T>> void partitionSortByDesc(T[] data, int low, int high) {
    		if(low >= high){
    			return;
    		}
    		/**使用两个指针 start 和 end*/
    		int start = low;
    		int end = high;
    		T key = data[low];
    		/**找到key的位置,然后将data分成两部分,分别再次进行递归*/
    		while(start < end){
    			while(start < end && data[start].compareTo(key) > 0){
    				start ++ ;
    			}
    			if(data[start].compareTo(key) <= 0){
    				T temp = data[start];
    				data[start] = data[end];
    				data[end] = temp;
    			}
    			while(start < end && data[end].compareTo(key) < 0){
    				end -- ;
    			}
    			if(data[end].compareTo(key) > 0){
    				T temp = data[end];
    				data[end] = data[start];
    				data[start] = temp;
    			}
    		}
    		/**左边的*/
    		if(start > low) partitionSortByDesc(data,low,start - 1);
    		/**右边的*/
    		if(end < high) partitionSortByDesc(data,end + 1, high);
    		
    	}
    

      

  • 相关阅读:
    Java基础知识强化之IO流笔记77:NIO之 Selector
    Java基础知识强化之IO流笔记76:NIO之 Channel(通道)之间的数据传输
    Java基础知识强化之IO流笔记75:NIO之 Scatter / Gather
    Java基础知识强化之IO流笔记74:NIO之 Buffer
    Java基础知识强化之IO流笔记73:NIO之 Channel
    Java基础知识强化之IO流笔记72:NIO之 NIO核心组件(NIO使用代码示例)
    谈谈数据库连接池
    纯JSP实现简单登录跳转
    快速查找无序数组中的第K大数?
    新版汉诺塔(UVa10795
  • 原文地址:https://www.cnblogs.com/Gabby/p/6526321.html
Copyright © 2011-2022 走看看