(Java数据结构和算法)希尔排序+快速排序

本文深入探讨了希尔排序和快速排序两种经典排序算法。希尔排序通过逐步缩小间隔对序列进行排序,而快速排序则利用分治策略,通过选择枢纽进行高效排序。文章详细解析了两种算法的实现过程,包括希尔排序的间隔变化策略和快速排序的划分步骤。

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

希尔排序

在这里插入图片描述
每隔一定间隔组成一个序列,对这个序列进行排序。逐渐缩短间隔,最后一次间隔必定是1。间隔的变化可以自行确定,书中介绍了h = 3*h + 1的变化策略。



public class Main {
	
	public static void main(String[] args){
		int[] a = {2, 3, 9, 1, 66, 4};
		shellSort(a);
		print(a);
		
	}
	public static void shellSort(int[] a){
		int inner, outer;
		int tmp;
		
		int h = 1;
		while(h <= a.length/3){
			h = 3*h + 1;
		}
		while(h >=1 ){ //最后的间隔必定是1
			for(outer =  h; outer < a.length; outer++){
				tmp = a[outer];
				inner = outer;

				while(inner >= h && tmp < a[inner-h]){
					a[inner] = a[inner-h];
					inner -= h;
				}
				a[inner] = tmp;
			}
			h = (h-1)/3;
		}
	}
	public static void print(int[] a){
		for(int i = 0; i < a.length; i++){
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
}

快速排序

快速排序很重要的一点就是划分,所以先说划分。

划分

划分就是需要选定一个枢纽(pivot),把小于枢纽的数挪到枢纽左边,把大于枢纽的数挪到枢纽右边。



public class Main {
	
	public static int[] a = {2, 34, 9, 10, 66, 4};

	public static void main(String[] args){
		
		recursionQuickSort(0, a.length-1);
		print(a);
		
	}
	//快速排序(递归、分治),区间[left, right]
	public static void recursionQuickSort(int left, int right){
		if(left >= right){
			return;
		}else{
			int pivot = a[right];//每次都选择最右边的那个元素作为枢纽,对枢纽左边
				//的元素进行划分,之后把划分的分界元素和枢纽交换
			int boundary = partition(left, right, pivot);
			recursionQuickSort(left, boundary-1);
			recursionQuickSort(boundary+1, right);
		}
	}
	//划分,返回划分的分界元素下标
	public static int  partition(int left, int right, int pivot){
		int leftPtr = left - 1;
		int rightPtr = right;//注意,这里实际上把最右边的元素a[right]用作枢纽,后面是--right
		while(true){
			while(leftPtr < right && a[++leftPtr] < pivot){}//从左便开始找,找一个大于枢纽的数
			while(rightPtr > 0 && a[--rightPtr] > pivot){}//从右边开始找,找一个小于枢纽的数
			if(leftPtr >= rightPtr){
				break;
			}else{
				swap(leftPtr, rightPtr);
			}
		}
		swap(leftPtr, right);
		return leftPtr;//返回的是分界处元素下标,该分界属于右边部分
	}
	public static void swap(int index1, int index2){
		int tmp = a[index1];
		a[index1] = a[index2];
		a[index2] = tmp;
	}
	public static void print(int[] a){
		for(int i = 0; i < a.length; i++){
			System.out.print(a[i]+" ");
		}
		System.out.println();
	}
}

基数排序简介

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值