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

    快速排序

    思路

    1.对于一个数组,首先先选择一个基准值key,这个基准值可以随意选,但是一般选择的是这个数组的第一个元素a[0]
    2.之后我们对于这个数组,把数组中所有比这个基准值key小的元素向基准值key的左边扔,把数组中所有比这个基准值key大的元素朝基准值key的右边扔
    3.这样的话基准值key就成为了一个"分界线",所有比基准值key小的元素都在基准值key的左边,所有比基准值key大的元素都在key的右边
    4.之后我们在递归的对基准值key左边的序列和右边的序列进行快速排序
    5.最终整个序列就是有序的了

    图解


    转载自http://www.pianshen.com/article/3751395422/

    代码实现

    package sort;
    
    public class QuickSort {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int[] a= {10,9,8,7,6,5,4,3,2,1,0};
    		for(int k:a)
    		{
    			System.out.printf("%d ",k);
    		}
    		System.out.println();
    		quickSort(a, 0, a.length-1);
    		for(int k:a)
    		{
    			System.out.printf("%d ",k);
    		}
    		
    	}
    	
    	public static void quickSort(int a[],int left,int right)
    	{
    		if(left>=right)
    		{
    			return ;
    		}
    		int i=left;
    		int j=right;
    		int key=a[left];
    		while(i<j)
    		{
    			while(i<j&&key<a[j])//从右向左找到第一个比key小的值
    			{
    				j--;//朝前面寻找
    			}
    			a[i]=a[j];//找到之后向左移动
    			while(i<j&&key>a[i])
    			{
    				i++;//从左向右找,找到第一个大于key的值
    			}
    			a[j]=a[i];//将比较大的值移动到右边
    			
    		}
    		a[i]=key;//把key移动到中间来分割左右,i现在是分割左右的下标
    		quickSort(a, left, i-1);
    		quickSort(a, i+1, right);
    		
    	}
    
    }
    
    

    复杂度

    • 时间复杂度:O(nlogn)
    • 空间复杂度:快速排序使用递归,递归使用栈,因此它的空间复杂度为O(logn)
    • 稳定性:快速排序无法保证相等的元素的相对位置不变,因此它是不稳定的排序算法
  • 相关阅读:
    当老板如何带团队?
    创业者第一法宝-了解自己
    交流才能交易,交易才能交心
    集合框架
    MySQL一些命令语法
    JS组成整理
    git中可以pull但是push提示Everything up-to-date的情况
    循环判断以及文件的使用--练习1
    Hello World !
    linux文件权限修改
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/11708945.html
Copyright © 2011-2022 走看看