数据结构与算法——八大排序算法(Java)

本文详细介绍了数据结构中的八大排序算法,包括直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序和基数排序。通过基本思想、算法描述及Java代码实现,阐述了各种排序算法的原理和步骤。文章适合于学习数据结构和算法的读者,特别是对排序算法感兴趣的Java开发者。
摘要由CSDN通过智能技术生成

一、直接插入排序

插入排序由于操作不尽相同, 可分为 直接插入排序 , 折半插入排序(又称二分插入排序), 链表插入排序 , 希尔排序 。我们先来看下直接插入排序。
1、基本思想

直接插入排序的基本思想是:将数组中的所有元素依次跟前面已经排好的元素相比较,
如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过为止。
在这里插入图片描述

2、算法描述

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下: ①. 从第一个元素开始,该元素可以认为已经被排序
②.取出下一个元素,在已经排序的元素序列中从后向前扫描
③. 如果该元素(已排序)大于新元素,将该元素移到下一位置
④.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⑤. 将新元素插入到该位置后
⑥. 重复步骤②~⑤

在这里插入图片描述

3、代码实现

import java.util.Arrays;
import java.util.Random;
public class InsertSort {
   
     public static void main(String[] args)  {
    
		Random ran = new Random();
		int[] arr = new int[20];
		for (int i = 0; i < 20; i++) {
   
			arr[i] = ran.nextInt(100) + 1; 10	
			}
		System.out.println(Arrays.toString(arr));
		sort(arr);
     System.out.println(Arrays.toString(arr)); 
     	}
		public static void sort(int[] arr){
   
			int i, tmp;
			for( i=1;i<arr.length;i++){
    //从第二个数字开始循环,
				tmp =arr[i];
				int j =i-1;
					while(j>=0&&arr[j]>tmp){
   
					arr[j+1] = arr[j];
					j--;
		}
     arr[j+1]= tmp;
    System.out.println("第" + i + "次" + Arrays.toString(arr)); 
	}
}
}



在这里插入图片描述

二、希尔排序(Shell Sort)

第一个突破O(n^2)的排序算法;是简单插入排序的改进版;
它与插入排序的不同之处在于,它会优先比较距离较远的元素。
希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序, 待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

1、基本思想
在这里插入图片描述

将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法进行排序;
每次再将gap折半减小,循环上述操作;当gap=1时,利用直接插入,完成排序

2、算法描述

1.选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;(一般初次取数组半长, 之后每次再减半,直到增量为1)
2. 按增量序列个数k,对序列进行k 趟排序;
3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理, 表长度即为整个序列的长度。

3、代码实现

import java.util.Arrays;
import java.util.Random; 
/*
 希尔排序
	*/
public class ShellSort {
    
		public static void main(String[] args) {
   
			Random ran = new Random();
			int[] arr = new int[10];
			for (int i = 0; i < 10; i++) {
   
					arr[i] = ran.nextInt(100) + 1; 
			}
			System.out.println(Arrays.toString(arr));
		    shell_sort(arr);
            System.out.println(Arrays.toString(arr));25	}


	public static void shell_sort(int[] arr) {
   
			int gap = 1, i, j, len = arr.length;
			int temp;
			while (gap < len / 3)
			gap = gap * 3 + 1;	// <O(n^(3/2)) by Knuth,1973>: 1, 4, 13, 40, 121, ...
			for (; gap > 0; gap /= 3) {
   
			for (i = gap; i < len; i++) {
   
			temp = arr[i];
			for (j = i - gap; j >= 0 && arr[j] > temp; j -= gap)
			arr[j + gap] = arr[j];
			arr[j + gap] = temp;
			}
		}
	}	
}		

在这里插入图片描述

三、选择排序(Selection Sort)

在这里插入图片描述

1、基本思想

选择排序的基本思想:比较 + 交换。

2、算法描述

①. 从待排序序列中,找到关键字最小的元素;
②. 如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;
③. 从余下的 N - 1 个元素中,找出关键字最小的元素,重复①、②步,直到排序结束。

3、代码实现

/*
 选择排序
 */
public class SelectSort {
   
    public static void main(String[] args)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

虚神公子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值