归并排序、希尔排序、快速排序的基本思想过程及java实现

本文详细介绍了归并排序、希尔排序及快速排序三种常见的排序算法。归并排序通过合并两个有序数组来实现排序;希尔排序是对直接插入排序的改进,通过逐步缩小增量进行排序;快速排序则是通过选取基准元素对数组进行划分。

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

参考博文:https://blog.youkuaiyun.com/qq_35434690/article/details/76187262

归并排序

归并排序是根据将两个有序数组合并成一个有序数组的思想发展而来,如果两个数组有序,那么只需要依次比较两个数组中的每个数,小的数放进空数组中,并原数组游标向前移动一位进行下一次比较,直到当一个数组的游标到达数组尾部(也就是这个数组被比较完了)时,直接将另一个数组剩余的数移到新数组即可完成排序。

public class MergeTest {
	public static void main(String[] args) {
		int[] num1 = {2,3,6,8,9,12};
		int[] num2 = {3,4,7,8};
		int[] docker = new int[10];
		
		int dex1=0,dex2=0,d=0;
		while(dex1<num1.length&&dex2<num2.length){//两个数组都还有元素的情况
			if(num1[dex1]<num2[dex2]){
				docker[d++]=num1[dex1++];
				//dex1++;自加在上一步实现
			}else{
				docker[d++]=num2[dex2++];
				//dex2++;
			}
		}
		//如果上面的while循环结束了,说明有一个数组已经为空,所以下面的循环可以不加dex1==num1.lengh
		while(dex1==num1.length&&dex2<num2.length){
			docker[d++]=num2[dex2++];
		}
		while(dex2==num2.length&&dex1<num1.length){
			docker[d++]=num1[dex1++];
		}
		
		for(int k:docker){
			System.out.print(k+" ");
		}
		
	}
}

 

希尔排序

 

希尔排序是插入排序的一种,也称为缩小增量排序,是直接插入排序的改进版。直接插入排序存在的缺陷是,当一个很小的数位于数组最右边时,因为需要一个个进行比较(步长为1),那么就需要比较N-1次并移动N-1次,如果是极端情况下,整个数组是倒序排序的,这种情况下效率就变得很低了。因此,为了改良其性能,提出了希尔排序,思路是选定步长,距离为步长的一组数先进行插入排序,之后步长缩短,再次排序,直至步长为1排序后结束。以数组为例,假设一个数组有N个元素,第一次选择一个合适的数a作为步长(增量),把所有距离为a的倍数的元素归为一组并对每组进行组内插入排序(注意:每组的数据在分组时并不改变在原数组的下标,只有在插入排序时才改变)。第一次组内排序后,再选取一个合适的数b作为新的步长(b<a)进行分组,并在组内排序,接着再重复执行缩小步长并排序,直到步长为1时排序结束。

希尔排序的效率:最差为N^2

/**
 * 希尔排序
 * @author ht
 */
public class ShellSort {
	public static void main(String[] args) {
		int[] arr = { 5, 2, 3, 6, 8, 24, 16, 55, 46, 1, 9, 15, 12, 32, 52, 71, 31, 39, 22 };
		shellSort(arr);
		System.out.println("希尔排序的最终结果为:");
		for (int i : arr) {
			System.out.print(i + " ");
		}
	}

	public static void shellSort(int[] arr) {
		int len = arr.length;
		int gap = len / 2;
		while (gap > 0) {// 随着循环次数增加,gap逐次减小,到1为止
			for (int i = 0; i < len - gap; i++) {// 对于每种gap值,遍历对应的每一对值
				int j = i + gap;
				while (j - gap >= 0 && arr[j - gap] > arr[j]) {//比较每一队值的大小关系
					int temp = arr[j - gap];
					arr[j - gap] = arr[j];
					arr[j] = temp;
					j -= gap;//依次向低位进行比较
				}
			}
			System.out.print("gap = " + gap + "时的排序结果:");
			for (int num : arr) {
				System.out.print(num + " ");
			}
			System.out.println();
			gap = gap / 2;
		}
	}
}

运行结果

快速排序

参考:https://blog.youkuaiyun.com/hrn1216/article/details/51526362

快速排序是冒泡排序的改进版,也是最好的一种内排序,在很多面试题中都会出现,也是作为程序员必须掌握的一种排序方法。快速排序首先选取数组中的一个元素作为基准元素用A表示,根据A将数组分成两部分,比A小的放在左边,比A大的放在右边。具体实现方法是定义两个游标i和j,分别放在数组的两端。假设i在左j在右,它们一起向中间移动寻找,i寻找一个比A大的元素B,j寻找一个比A小的元素C,然后交换B和C。当i和j走到中间相遇时第一轮划分结束。然后再对左右两部分数组分别选取各自的基准元素进行划分,。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值