首页 > 编程语言 >【算法】冒泡排序、简单选择排序、基数排序、插入排序、希尔排序

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

时间:2024-04-03 13:30:19浏览次数:29  
标签:arr int 插入排序 冒泡排序 ++ length void 排序 public

冒泡排序

冒泡排序的核心思想是两两进行对比交换。从索引 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+1];
						arr[j+1] = temp;
					}
				}
			}
		}
	}
}

标签:arr,int,插入排序,冒泡排序,++,length,void,排序,public
From: https://blog.csdn.net/2302_78914800/article/details/137212629

相关文章

  • 剑指Offer题目笔记24(集合的组合、排序)
    面试题79:问题:​输入一个不含重复数字的数据集合,找出它的所有子集。解决方案:​使用回溯法。子集就是从一个集合中选出若干元素。如果集合中包含n个元素,那么生成子集可以分为n步,每一步从集合中取出一个数字,此时面临两个选择,将该数字添加到子集中或不将该数字添加到子集......
  • 深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度
    看这篇前请先把我上一篇了解一下:深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客前言:相信很多学习数据结构的人,都会遇到一种情况,就是明明最一开始学习就学习了时间复杂度,但是在后期自己写的程序或者是做到哪个需要判断时间复杂度的题时,仍然判断不出来时间复杂度是多少,今......
  • 常见的排序算法——选择排序
    本文记述了选择排序的基本思想和一份参考实现代码,并在说明了算法的性能后用实验进行了验证。◆思想将第一个元素开始的所有元素作为待排序范围,通过一一比较,查找待排序范围内的最小元素,将其与范围内的第一个元素交换。然后将从第二个元素开始的所有元素作为新的待排序范围。重复......
  • 排序算法-选择排序
    选择排序:遍历数组,找到最小值,放到arr[0],遍历剩下的数组,找到最小值放到arr[1],以此类推。思路:第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]~arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~arr[n-1]中选取最小值,与arr[2]交换,...,第i次从arr[i-1]~a......
  • 11种排序算法(Python实现)
    10种排序算法(Python实现)冒泡排序1、两重循环,每次都将一个点移动到最终位置defBubbleSort(lst):n=len(lst)ifn<=1:returnlstforiinrange(0,n):forjinrange(0,n-i-1):#每轮确定一个点的最终位置iflst[j]>lst[j+1]:......
  • 【Java】使用 Java 语言实现一个冒泡排序
    【Java】使用Java语言实现一个冒泡排序前言上一篇文章已经学习了,如何使用IDE集成开发工具编写Java代码,并输出了一段HelloWorld的代码。本篇文章将通过IDE使用Java语言实现一个冒泡排序。冒泡排序介绍冒泡排序也是一种简单直观的排序算法。冒泡排序的基本思想是多次遍历......
  • 冒泡排序
    1、基本概念这里使用C++来实现冒泡排序法冒泡排序法采用不停地交换彼此位置来实现,故而形象地称之为冒泡冒泡排序主要是由两层循环组成(这里记下来的原因就是两层循环的停止条件,自己编写出了错误)。1、外层循环:主要是用来轮询;2、内层循环:主要用来交换位置(前提是满足if条件)3、外......
  • 排序链表
    1、非递归//递归的归并排序classSolution{public:ListNode*sortList(ListNode*head){if(head==nullptr)returnhead;intlength=0;ListNode*node=head;while(node!=nullptr){length++;......
  • 关于排序稳定性
    堆排序、快速排序、希尔排序、直接选择排序是不稳定的排序算法,而冒泡排序、直接插入排序、折半插入排序、归并排序是稳定的排序算法。首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简......
  • 23--归并排序
     算法描述:就是将两个有序的合并为一个较大的有序的,直到完全有序为止,也称为2路归并。其时间复杂度是,空间复杂度是,并且稳定。代码如下:#include<stdio.h>#include<malloc.h>#include<assert.h>//一趟归并(自己使用,用static),一趟归并的时间复杂度为O(n)//gap:归并段的长度......