数据结构(Java)——排序问题(二)

19 篇文章 0 订阅
本文深入探讨了两种高效的排序算法——希尔排序和快速排序。希尔排序通过分组和插入排序的结合提高效率,而快速排序利用分治策略实现快速排序。文章详细解析了希尔排序的交换法和移动位置法,并对交换法进行了优化。同时,介绍了快速排序的基本思想和实现步骤,展示了其如何通过一趟排序将数据分割并递归排序。通过对这两种算法的分析,为理解排序算法提供了宝贵见解。
摘要由CSDN通过智能技术生成

排序问题(二)

希尔排序法

希尔排序是希尔(DonaldShell) 于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为
缩小增量排序。

希尔排序法基本思想:
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;
随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰
被分成一组,算法便终止

希尔排序分两种情况:交换法和移动位置法
交换法:

依次分组,缩小增量,比较组间相应位置的元素,进行交换

public static void shell(int[] arr) {
		int temp = 0;
		int k = 0;
		for (int gap = arr.length / 2; gap > 0; gap /= 2) {
			k++;
			for (int i = gap; i < arr.length; i++) {
				for (int j = i - gap; j >= 0; j -= gap) {
					// 若当前元素大于加上步长之后的元素,交换
					if (arr[j] > arr[j + gap]) {
						temp = arr[j];
						arr[j] = arr[j + gap];
						arr[j + gap] = temp;
					}

				}
			}
			System.out.println("希尔排序的第" + k + "轮后=" + Arrays.toString(arr));
		}

这个方法比普通的插入法的耗时更长,不适用

移动位置法:

依次分组,缩小增量,从第一个二个组开始,比较相差一个增量的各元素的大小,排序,这个方法耗时极短

// 对交换式的希尔排序进行优化,移位法
	public static void shellpro(int[] arr) {
		int temp = 0;
		int k = 0;
		for (int gap = arr.length / 2; gap > 0; gap /= 2) {
			k++;
			for (int i = gap; i < arr.length; i++) {
				int j = i;
				temp = arr[j];
				if (arr[j] < arr[j - gap]) {
					while (j - gap >= 0 && temp < arr[j - gap]) {
						arr[j] = arr[j - gap];
						j -= gap;

					}
					arr[j] = temp;
				}
			}

			System.out.println("希尔排序的第" + k + "轮后=" + Arrays.toString(arr));
		}
	}

对于希尔排序使用移动位置法比较好,但是理解有点费劲

快速排序

快速排序(Quicksort) 是对冒泡排序的一种改进

基本思想是:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有 数据都比另外-部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

也就是先找个基准,然后找出比他大、小的数字出来,左右递归,重复操作,完成排序

public static void quicksort(int[] arr,int left,int right) {
		int l = left;//左下标
		int r = right;//右下标
		int temp = 0;
		int priv = arr[(left+right)/2];//中轴值
		while(l<r) {//目的:把比中轴值小的放到左面大的放到右面
			while(arr[l]<priv) {//在中轴左面一直找,大于等于中轴退出
				l+=1;
			}
			while(arr[r]>priv) {//在中轴右面一直找,小于等于中轴退出
				r-=1;
			}
			if(l >= r) {//正确顺序
				break;
			}
			//交换
			temp = arr[l];
			arr[l] = arr[r];
			arr[r] = temp;
			
			if(arr[l] == priv) {//如果和中轴相等则前移
				r-=1;
			}
			if(arr[r] == priv) {//如果和中轴相等则后移
				l+=1;
			}
			System.out.println(Arrays.toString(arr));
		}
		//必须的东西,否则栈溢出
		if(l == r) {
			l += 1;
			r -=1;
		}
		//左递归
		if(left<r) {
			quicksort(arr,left,r);
		}
		//右递归
		if(right>l) {
			quicksort(arr,l,right);
		}
	}

每次的排序结果就像这个:

image-20211226121424823

空间换时间(8000000数据用2S)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

痞子三分冷ゾジ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值