zoukankan      html  css  js  c++  java
  • 快速排序

    快速排序

    快速排序法介绍:

    快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

    public static void quickSort(int[] arr,int left, int right) {
    		int l = left; //左下标
    		int r = right; //右下标
    		//pivot 中轴值
    		int pivot = arr[(left + right) / 2];
    		int temp = 0; //临时变量,作为交换时使用
    		//while循环的目的是让比pivot 值小放到左边
    		//比pivot 值大放到右边
    		while( l < r) { 
    			//在pivot的左边一直找,找到大于等于pivot值,才退出
    			while( arr[l] < pivot) {
    				l += 1;
    			}
    			//在pivot的右边一直找,找到小于等于pivot值,才退出
    			while(arr[r] > pivot) {
    				r -= 1;
    			}
    			//如果l >= r说明pivot 的左右两的值,已经按照左边全部是
    			//小于等于pivot值,右边全部是大于等于pivot值
    			if( l >= r) {
    				break;
    			}
    			
    			//交换
    			temp = arr[l];
    			arr[l] = arr[r];
    			arr[r] = temp;
    			
    			//如果交换完后,发现这个arr[l] == pivot值 相等 r--, 前移
    			if(arr[l] == pivot) {
    				r -= 1;
    			}
    			//如果交换完后,发现这个arr[r] == pivot值 相等 l++, 后移
    			if(arr[r] == pivot) {
    				l += 1;
    			}
    		}
    		
    		// 如果 l == r, 必须l++, r--, 否则为出现栈溢出
    		if (l == r) {
    			l += 1;
    			r -= 1;
    		}
    		//向左递归
    		if(left < r) {
    			quickSort(arr, left, r);
    		}
    		//向右递归
    		if(right > l) {
    			quickSort(arr, l, right);
    		}
    		
    		
    	}
    

    快速排序法应用实例:
    要求: 对 [-9,78,0,23,-567,70] 进行从小到大的排序,要求使用快速排序法。【测试8w和800w】
    说明[验证分析]:
    如果取消左右递归,结果是 -9 -567 0 23 78 70
    如果取消右递归,结果是 -567 -9 0 23 78 70
    如果取消左递归,结果是 -9 -567 0 23 70 78

  • 相关阅读:
    公用表表达式(CTE)的递归调用
    c# 如何让tooltip显示文字换行
    实战 SQL Server 2008 数据库误删除数据的恢复
    SQL SERVER数据库中 是否可以对视图进行修改删除
    asp.net中实现文件批量上传
    sql server 2008学习2 文件和文件组
    sql server 2008学习3 表组织和索引组织
    sql server 2008学习4 设计索引的建议
    sql server 2008学习10 存储过程
    .net 调用 sql server 自定义函数,并输出返回值
  • 原文地址:https://www.cnblogs.com/wanwanyuan/p/14328256.html
Copyright © 2011-2022 走看看