JAVA基础篇:基础排序算法

本文介绍了三种基础排序算法:冒泡排序、选择排序和插入排序,详细阐述了它们的原理和实现过程,并提供了Java代码示例。冒泡排序通过相邻元素比较交换实现排序;选择排序每次找到最小(或最大)元素并放置到正确位置;插入排序则将每个元素插入到已排序部分的正确位置。此外,还提及了二分查找的原理和适用场景。
摘要由CSDN通过智能技术生成

冒泡排序法:


原理简介:

从前向后(或从后向前)依次比较相邻的元素,若发现逆顺序,则交换。小的向前换,大的向后换,像水底的气泡逐渐向上冒,顾名思义冒泡排序法

通俗一点就是把大的往上挪!!!像冒泡一样。
是交换式排序法的一种。(冒泡排序法效率较低)

冒泡排序法思路:

1:外层循环:控制它要走多少次。
假设你有5个数,那就要走4次,最后一次不用走,最后那个数已经在它位置了所以就要length-1次。
2:内层循环:控制逐一比较,如果发现前一个数比后一个数大,则交换。
注意!因为越比较长度就越小了,所以长度要length-1-i。

代码示例:

package Homework;
//冒泡排序法
public class Testone01 {

	public static void main(String[] args) {
		int[] arr = {45,53,62,98,87,76,48,85,92,59};
		selectNum(arr);
		for (int i : arr) {
			System.out.print(i + ",");
		}
	}

	public static void selectNum(int[] arr) {
		for (int i = 0; i < arr.length-1; i++) {
			for (int j = 0; j < arr.length-1-i; j++) {
				if(arr[j] > arr[j+1]) {
					swap(arr,j,j+1);
				}
			}
		}
		
	}

	public static void swap(int[] arr, int j, int i) {
		arr[i] = arr[i] + arr[j];
		arr[j] = arr[i] - arr[j];
		arr[i] = arr[i] - arr[j];
		
	}

}

选择排序法:


原理简介:

选择排序原理即是,遍历元素找到一个最小(或最大)的元素,把它放在第一个位置,然后再在剩余元素中找到最小(或最大)的元素,把它放在第二个位置,依次下去,完成排序。

选择排序思路:

一:外层循环:控制它要走多少次,同样是length-1次。
1:设置一个最小值,假设第一个就是最小值(默认为i)
2:设置一个最小值下标(也就是最小值索引)。
二:内层循环:用你当前的最小值去逐一比较。当有比当前最小值小的数时,记录最小值,记录下标。退出内层循环后就交换位置。

代码示例:

package Homework;
//选择排序法
public class Testone02 {
	public static void main(String[] args) {
		int[] arr = {45,53,62,98,87,76,48,85,92,59};
		selectNum(arr);
		for (int i : arr) {
			System.out.print(i + ",");
		}
	}

	public static void selectNum(int[] arr) {
		for (int i = 0; i < arr.length-1; i++) {
			int minIndex = i;//记录最小值索引,默认为i
			for (int j = i; j < arr.length; j++) {
				if(arr[j] < arr[minIndex]) {
					minIndex = j;
				}
			}
			if (i != minIndex) {
				swap(arr,i,minIndex);
			}
		}
		
	}

	public static void swap(int[] arr, int i, int minIndex) {
		arr[i] = arr[i] + arr[minIndex];
		arr[minIndex] = arr[i] - arr[minIndex];
		arr[i] = arr[i] - arr[minIndex];
		
	}

}

插入排序法:


原理简介:

把i个待排序的元素看成一个有序表和无序表。一开始有序表只包含一个元素,无序表中包含i-1个元素。排序过程中每次从无序表中取出第一个元素,把它依次与有序表中的元素进行比较。然后把它插入到有序表的适当位置,形成新的有序表

通俗来讲:假设第一个元素是有序的,后面的元素往前插入,依次进行比较,小的往前挪,大的往后挪,找到合适的位置插入。打个形象的比方就是打扑克牌时的摆牌。

选择排序思路:

一:外层循环:控制它要走多少次,因为第一个是有序的,所以不用参与插入,所以从1开始,所以是length次。

二:内层循环:如果插入的数比被插入的数小,就要把被插入的数向后移,插入的数向前移,j-就退出了循环,当不满足循环条件后就找到了合适的位置插入。

原理图:

 代码示例:

package Homework;
//插入排序法
public class Testone03 {
	public static void main(String[] args) {
		int[] arr = {45,53,62,98,87,76,48,85,92,59};
		selectNum(arr);
		for (int i : arr) {
			System.out.print(i + ",");
		}
	}

	public static void selectNum(int[] arr) {
		for (int i = 1; i < arr.length; i++) {
			for (int j = i; j >0; j--) {
				if(arr[j] < arr[j-1]) {
					 int temp = arr[j];
	                    arr[j] = arr[j - 1];
	                    arr[j - 1] = temp;
				}
			}
		}
		
	}

}

查询算法(二分查找(折半查找)):


原理简介:

二分查找又称为折半查找,它是一种效率较高的查找方法,但是,折半查找要求线程表必须采用顺序存储结构,且表中的元素是有序的。如果查询数据是无序的,那就找线性(遍历)查找。

适用范围:

适用于经常查找的、但是不变的(增删)的有序列表。

原理图:

 代码示例:

package Excise;

//二分查找
public class Test {

	public static void main(String[] args) {
		int[] arr = {1, 2, 9, -100, -55, 23, -99, 0, 3, 4, 8};
		bubbleSort(arr);
		int index = binarySearch(arr, -55);
		System.out.println(index);
	}

	public static void bubbleSort(int[] arr) {
			for (int i = 0; i < arr.length - 1; i++) {
				for (int j = 0; j < arr.length - 1 - i; j++) {
					if (arr[j] > arr[j+1]) {
						swap(arr, j, j+1);
					}
				}
			}
		}

	private static void swap(int[] arr, int j, int i) {
		arr[i] = arr[i] + arr[j];
		arr[j] = arr[i] - arr[j];
		arr[i] = arr[i] - arr[j];
		}

	public static int binarySearch(int[] arr, int key) {
		int start = 0;
		int end = arr.length - 1;
		while (start <= end) {
			// 注意,需要将中间值的下标重新计算
			int middle = (start + end) / 2;
			if (arr[middle] > key) {
				end = middle - 1;
			} else if (arr[middle] < key) {
				start = middle + 1;
			} else {
				return middle;
			}
		}
		return -1;
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值