快速排序的两种实现方式

news/2024/5/19 22:17:12 标签: 数据结构, 快速排序

快速排序的两种实现方式

相互覆盖类

public class quickSort1 {
    public static void main(String args[])
    {
        int[] array = {2,3,1,4,5,7,5,8,9,10};
        quickSort(0,array.length-1,array);
        for(int i : array)
        {
            System.out.println(i);
        }

    }
    public static void quickSort(int low,int high,int[] array)
    {
       	//定义递归结束条件,当low>=high的时候,说明只有1个元素
      	if(low>=high)
      	{
      		return ; //直接返回
      	}else{
      		int index = partiton(low,high,array);
      		//给左侧子序列做快排
      		quickSort(low,index-1,array);
      		//给右侧子序列做快排
      		quickSort(index+1,high,array);
      	}
    }
    public static int  partition(int low,int high,int[] array)
    {
    //以数组的
       	int key = array[low];
       	while(low<high)
       	{
       		//从后往前遍历,如果 array[high] > key,high--
       		while((array[high]>key)&&(high>low))
       		{
       			high--;
       		}
       		//如果此时low<high,说明array[high]是一个小于key的数
       		//把array[high]赋值给array[low](正好是key)
       		if(low<high)
       		{
       			array[low] = array[high];
       		}
       		//从前到后,如果array[low]<key,low++
       		while((array[low]<key)&&(high>low))
       		{
       			low++;
       		}
       		//如果此时low<high,说明array[low]是一个大于key的数
       		//把array[low]赋值给array[high](之前已经覆盖到了前面),从而完成了交换
       		if(low<high)
       		{
       			array[high] = array[low];
       		}
       	}
       	//在遍历的时候严格限制了low<high,因此在这里就只有一种情况,即low==high,此时low的位置就是基准key的位置
       	array[low] = key;
       	return low; //把新的位置返回
    }
}

直接交换类型

public class quickSort2 {
    //快拍第二种实现方式,交换
    public static void main(String args[])
    {
        int[] array = {10,9,8,7,6,5,4,3,2,1};
        quickSort(0,array.length-1,array);
        for(int i : array)
        {
            System.out.print(i+" ");
        }
        System.out.println();
    }
    public static void quickSort(int low,int high,int[] array)
    {
        //递归终止条件
        if(low>=high)
        {
            return ;
        }if(low<high)
        {
            int index = partition(low,high,array);
            //左侧子序列 快排
            quickSort(low,index-1,array);
            //右侧子序列 快拍
            quickSort(index+1,high,array);
        }
    }
    public static int  partition(int low,int high,int[] array)
    {
    	//先定义基准值
    	int key = array[low];
    	int keyValue = low;
    	//开始partition
    	while(low<high)
    	{
    		//从后向前遍历,如果array[high] > key,high--
    		while((array[high]>key)&&(low<high))
    		{
    			high--;
    		}
    		//如果array[low] > key ,high++
    		while((array[low]<=key)&&(low<high))
    		{
    			low++;
    		}
    		/*
    		此时只有两种情况:
    		1、low<high 说明array[low]和array[high]一个大一个小,符合交换条件
    		1、low == high,说明array[low]和array[high]在同一位置无影响
    		*/
    		//执行交换
    		int temp = array[low];
    		array[low] = array[high];
    		array[high] = temp;
    	} 
    	//这个时候low==high但有两种情况
    	/*
    	 1、array[low] = array[high] >key
    	 2、array[low] = array[high] <key
    	*/
    	if(array[low]>key)
    	{
    		//array[low-1]与key互换
    		array[keyValue] = array[low-1];
    		array[low-1] = key;
    		//返回index low-2
    		return low-1;
    	}else
    	{
    		//array[low]与key互换
    		array[keyValue] = array[low];
    		array[low] = key;
    		//返回index low
    		return low;
    	}
    }
}


http://www.niftyadmin.cn/n/1677154.html

相关文章

[LeetCode] #1# Two Sum : 数组/哈希表/二分查找/双指针

一. 题目1. Two SumTotal Accepted: 241484 Total Submissions: 1005339 Difficulty: EasyGiven an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one solution.Exam…

Ninject 2.x细说---1.基本使用

本来想使用一下Ninject的,然后搜索了很久,都没找到比较详细的关于Ninject的使用方法等内容.于是乎干脆自己来写几篇介绍Ninject的内容. 1. 依赖注入和IOC 依赖注入和IOC的概念,可以点击这里看之前的文章.在这里就不多介绍了. 2. 环境准备 开发环境&#xff1a;WIN7 …

任务和SSH

at 时间键入要做的任务Ctrld进行任务的提交可以使用atq或者at –l来进程查看<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />可以让系统在该时间完成要求的任务 然后以邮件的形式发送At –f 文件 时间 则可以让系统读取一…

java并发编程实战-线程池的使用1

1&#xff0c;在任务与执行策略之间的隐形耦合 1.1&#xff0c;Executor框架可以将任务的提交与任务的执行策略解耦开来&#xff0c;并且为制定和修改执行策略都提供了相当大的灵活性&#xff0c;但并非所有的任务都能够使用所有的执行策略。有些类型任务需要明确地指定执行策略…

行为科学统计(第七版) 笔记01

科学研究是一个系统&#xff0c;我们用它来收集信息&#xff0c;而统计则是一个工具&#xff0c;我们用它从这些信息中提取合理的结论。本书的目的不仅是讲述这些统计方法&#xff0c;并且还讲解了科学及日常生活中重要的客观法则和逻辑。 1。统计这个概念被用来描述&#xff0…

空类型指针和其他类型指针转换根本原则

Windows 下任何指针都是一个 32 位地址&#xff0c;也就是 4 个字节。所以不管什么类型的指针都可以强制转换的。指针类型的意义在于告诉编译器要同时处理该地址以及以后的几个字节。例如一个指针 p 的值是 0x0041FF10 &#xff08;瞎编的&#xff09;如果它是 int * 类型的那么…

How-To: UFW - Ucomplicated Firewall

Securing Solr administrative consolehttp://drupal.org/node/658466sudo apt-get install gufw

菜鸟学习日记:跟我一起学office2007之Excel【01开篇】

不知道大家在平时的工作中对于办公软件&#xff0c;尤其是Microsoft Office2007软件的运用多少。 自己工作一年了&#xff0c;换过不少的工作&#xff0c;在工作过的公司&#xff0c;有做信息统计的&#xff0c;有做OA系统的&#xff0c;有做国内一些项目的。这些工作中都会或多…