【算法】冒泡排序、简单选择排序、基数排序、插入排序、希尔排序

冒泡排序

冒泡排序的核心思想是两两进行对比交换。从索引 i=0 开始,索引 i 所对应的值与索引 i+1 所对应的值进行对比交换。不断进行以上操作,每一轮都会让至少一个数变得符合顺序。

package com.test;

import java.util.Arrays;

public class BubbleSort {
	public static void main(String[] args) {
		int[] arr = {2,1,6,5,8,7,4,3};
		sort(arr);	
	}
	public static void sort(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length-1; j++) {
				if (arr[j] > arr[j+1]) {
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
		System.out.println(Arrays.toString(arr));
	}
}
简单选择排序

将待排序数组中的最小值与第一个数进行交换。我们需要定义一个游标,其永远指向待排序数组中的第一个数。

package com.test;

import java.util.Arrays;

public class SearchSort {
	public static void main(String[] args) {
		int[] arr = {2,1,6,5,8,7,4,3};
		sort(arr);
		System.out.println(Arrays.toString(arr));
	}
	public static void sort(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			int min = arr[i];
			int MinIndex = i;
			for (int j = i; j < arr.length; j++) {
				if (arr[j] < min) {
					min = arr[j];
					MinIndex = j;
				}
			}
			int temp = arr[i];
			arr[i] = arr[MinIndex];
			arr[MinIndex] = temp;
		}
	}
}
基数排序

个位、十位、百位…依次变得有序。

首先定义0~9共十个桶。

首先按个位排序。

然后将数据依次取出。

然后按十位排序。

然后将数据依次取出。

然后按百位排序……

如何实现基数排序

1、桶从哪来

十个桶可以用一个二维数组来代替。

考虑到极端情况(十个数取值相同),桶的高度一定是数组的长度。

我们以个位为例:

for (int i = 0; i < arr.length; i++) {
    int element = arr[i] % 10;
}

element的作用是确定将数据储存到哪个桶当中。

为了明确往桶的哪个位置放入数值,我们定义一个桶记录器。桶记录器记录当前桶中有几个数据。

2、如何将数据取出

如果桶记录器对应的值不为0,则将桶中的数据依次取出。

以下是将个位排序的代码

package com.test;

import java.util.Arrays;

public class JiShuSort {
	public static void main(String[] args) {
		int[] arr = {88,4,2,10,9,8,14,201,874,12,63,78,94,26,62,41,19};
		sort(arr);
	}
	public static void sort(int[] arr) {
		//创建桶
		int[][] bucket = new int[10][arr.length];
		//创建桶记录器
		int[] bucketCount = new int[10];
		//排序个位
		for (int i = 0; i < arr.length; i++) {
			int element = arr[i] % 10;
			int count = bucketCount[element];
			bucket[element][count] = arr[i];
			bucketCount[element]++;
		}
		int i = 0;
		//数据取出
		for (int k = 0; k < bucketCount.length; k++ ) {
			if (bucketCount[k] != 0) {
				for (int h = 0; h < bucketCount[k]; h++) {
					arr[i] = bucket[k][h];
					i++;
				}
			}
		}
		System.out.println(Arrays.toString(arr));
		
	}
}

以下是完整的基数排序代码

package com.test;

import java.util.Arrays;

public class JiShuSort {
	public static void main(String[] args) {
		int[] arr = {88,4,2,10,9,8,14,201,874,12,63,78,94,26,62,41,19};
		sort(arr);
	}
	public static void sort(int[] arr) {
		//找到最大值
		int max = arr[0];
		for (int i = 0; i < arr.length; i++) {
			if (max < arr[i]) {
				max = arr[i];
			}
		}
		//确定最大值的位数
		int MaxLength = (max + "").length();
		//创建桶
		int[][] bucket = new int[10][arr.length];
		//创建桶记录器
		int[] bucketCount = new int[10];
		
		int n = 1;
		for (int w = 0; w < MaxLength; w++) {
			//排序
			for (int i = 0; i < arr.length; i++) {
				int element = arr[i] / n % 10;
				int count = bucketCount[element];
				bucket[element][count] = arr[i];
				bucketCount[element]++;
			}
			int a = 0;
			//数据取出
			for (int k = 0; k < bucketCount.length; k++ ) {
				if (bucketCount[k] != 0) {
					for (int h = 0; h < bucketCount[k]; h++) {
						arr[a] = bucket[k][h];
						a++;
					}
				}
				//清空桶记录器
				bucketCount[k] = 0;
			}
			n *= 10;
		}
		System.out.println(Arrays.toString(arr));
	}
}
插入排序

类似于冒泡排序,从索引为 i=1 的数据开始遍历,每次将前 i+1 个数排序。

package com.test;

import java.util.Arrays;

public class InsertSort {
	public static void main(String[] args) {
		int[] arr = {2,3,8,4,6,9,7,1,5,0};
		sort(arr);
		System.out.println(Arrays.toString(arr));
	}
	public static void sort(int[] arr) {
		for (int i = 1; i < arr.length; i++) {
			for (int j = i-1; j >= 0; j--) {
				if (arr[j] > arr[j+1]) {
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
	}
}
希尔排序

插入排序存在的问题:
当较小数据在后边,效率会受到较大影响。

为了解决这个问题,我们使用希尔排序。

对希尔排序的介绍:使用了分组的思想,将数据两两分成一组,间隔是数组长度的一半。

然后在组内进行排序。

然后将数据再次分组,间隔是数组长度的四分之一。

然后在组内进行排序。

重复上述操作,直到间隔为1。

针对该情况,我们有以下代码

package com.test;

import java.util.Arrays;

public class ShellSort {
	public static void main(String[] args) {
		int arr[] = {5,7,4,2,0,3,1,6};
		sort(arr);
		System.out.println(Arrays.toString(arr));
	}
	public static void sort(int[] arr) {
		for(int i = 4; i < arr.length; i++) {
			for (int j = i-4; j >= 0; j -= 4) {
				if (arr[j] > arr[j+4]) {
					int temp = arr[j];
					arr[j] = arr[j+4];
					arr[j+4] = temp;
				}
			}
		}
		for(int i = 2; i < arr.length; i++) {
			for (int j = i-2; j >= 0; j -= 2) {
				if (arr[j] > arr[j+2]) {
					int temp = arr[j];
					arr[j] = arr[j+2];
					arr[j+2] = temp;
				}
			}
		}
		for(int i = 1; i < arr.length; i++) {
			for (int j = i-1; j >= 0; j -= 1) {
				if (arr[j] > arr[j+1]) {
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
	}
}

以下是完整的希尔排序代码

package com.text;
 
import java.util.Arrays;
 
public class ShellSort {
	public static void main(String[] args) {
		int[] arr = {5,7,4,2,0,3,1,6};
		sort(arr);
		System.out.println(Arrays.toString(arr));
	}
	public static void sort(int[] arr) {
		for (int g = arr.length/2; g >= 1; g /= 2) {
			for (int i = g; i < arr.length; i++) {
				for (int j = i-g; j >= 0; j -= g) {
					if (arr[j] > arr[j+g]) {
						int temp = arr[j];
						arr[j] = arr[j+g];
						arr[j+g] = temp;
					}
				}
			}
		}
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值