快速排序解析(JAVA实现)

本文详细介绍了快速排序算法的工作原理及其实现过程。通过选取一个中心值(KEY),将数组分为两个部分,使得左侧元素均小于KEY,右侧元素均大于KEY,然后递归地对两侧进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序是一种“分而治之”的排序算法,通过随机选择“分区点”来避免出现最坏的情况,排序的效率较高。

比如说一个数组A,我们可以随机选择一个中心值KEY,比如说A[0],通过遍历交换可以将数组A分成以KEY为中心两个部分,KEY左边的数都比KEY小,KEY右边的数都比KEY大,然后对左右两部分再次运用以上算法,直到排序完成。
我们来递归调用以下算法就可以完成快速排序算法:
1,定义 i = 0,j = A.length - 1,i 为第一个数的下标,J为最后一个数下标
2,从数组的最后一个数Aj从右往左找,找到第一小于key的数,记为Aj;
3,从数组的第一个数Ai 从左往右找,找到第一个大于等于KEY的数,记为Ai;
4,交换 Ai 和 Aj  
5,重复这个过程,直到  i = j
6,调整key的位置,把A[i] 和key交换

 

假设要排的数组为:A[8] ={ 5 2 8 9 2 3 4 9 }

选择 key = 5, 开始时 i=0,j=7

index         0    1    2    3    4    5    6    7

 

开始:          2    8    9    2    3    4    9

                  i                                         j  

第一次找   5    2    8    9    2    3    4    9

                              i                       j

交换:       5    2    4    9    2    3    8    9 

                              i                       j

第二次找   5    2    4    9    2    3    8    9

                                    i           j

交换:       5    2    4    3    2    9    8    9

                                    i            j

第三次找    5    2    4    3    2    9    8    9

                                          ij   

调整key:    5    4    3    5    9    8    9

 

JAVA实现的代码如下:


 
package chenxiloong;

import java.util.Arrays;

public class QuickSort {

	 public static void main(String[] args) {  
	        int[] a = {1, 2, 4, 5, 7, 4, 5 ,3 ,9 ,0};  
	        System.out.println(Arrays.toString(a));  
	        quickSort(a);  
	        System.out.println(Arrays.toString(a));  
	    }  
	  
	    public static void quickSort(int[] a) {  
	        if(a.length>0) {  
	            quickSort(a, 0 , a.length-1);  
	        }  
	    }  
	    private static void quickSort(int[] a, int low, int high) {  
	        //1,找到递归算法的出口  
	        if( low > high) {  
	            return;  
	        }  
	        //2, 存  
	        int i = low;  
	        int j = high;  
	        //3,key  
	        int key = a[ low ];  
	        //4,完成一趟排序  
	        while( i< j) {  
	        	//4.1 ,从右往左找到第一个小于key的数  
	            while(i<j && a[j] > key){  
	                j--;  
	            } 
	            // 4.2 从左往右找到第一个大于等于key的数  
	            while( i<j && a[i] <= key) {  
	                i++;  
	            }
	            System.out.println("i====="+i+"=======j======"+j);
	            System.out.println("key====="+key+"=======执行过程========"+Arrays.toString(a));
	            //4.3 交换  
	            if(i<j) {  
	                int p = a[i];  
	                a[i] = a[j];  
	                a[j] = p;  
	            }
	            System.out.println("key====="+key+"=======执行过程========"+Arrays.toString(a));
	        }  
	        System.out.println("调整key的位置");
	        // 4.4,调整key的位置  
	        int p = a[i];  
	        a[i] = a[low];  
	        a[low] = p;  
	        //5, 对key左边的数快排  
	        quickSort(a, low, i-1 );  
	        //6, 对key右边的数快排  
	        quickSort(a, i+1, high);  
	    }  
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值