排序算法笔记

*动图与部分算法介绍引用自https://www.cnblogs.com/onepixel/articles/7674659.html

冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 

动态演示:

原理:对相邻两个元素进行两两比较,将两者间较大(小)的交换位置

代码演示:

package sort;
/**
 * Author:FengWenSheng
 * Date:Mar 2, 2019
 * Description:Sort02.java
 */
public class Sort02 {
	/**
	 * 冒泡排序
	 * */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/**
		 * 原理:对相邻两个元素进行两两比较,将两者间较大(小)的交换位置
		 * 第一层for循环表示需要遍历的元素个数
		 * 一般写为arr.length
		 * 但是因为在最后第二次遍历时,实际上已经确定了最后两个的大小,而最后一个已经不需要再进行比较了
		 * 也可以写为arr.length - 1节省最后一次运算
		 * 第二层for循环遍历相邻的两两元素之间的大小
		 * 每一次循环后内循环遍历次数减一(因为不需要比较之前比较后排好的元素)
		 * 因为在判断语句中需要与后一位进行相邻比较
		 * 因此在此基础上需要减去1,不需要遍历全部,也避免了数组下标超出范围
		 * arr.length - i - 1
		 * */
		int[] arr = {3,2,5,1,4};
		for (int i = 0; i < arr.length - 1; i++) {
			
			for (int j = 0; j < arr.length - i - 1; j++) {
				
				if (arr[j] > arr[j+1]) {
					int idx = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = idx;
				}
				
			}
			
		}
		
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}

}

第一层for循环表示需要遍历的元素个数,一般写为(arr.length)。但是因为在最后第二次遍历时,实际上已经确定了最后两个的大小,而最后一个已经不需要再进行比较了,所以也可以写为(arr.length - 1)节省最后一次运算

第二层for循环遍历相邻的两两元素之间的大小,每一次循环后内循环遍历次数减一(因为不需要比较之前比较后排好的元素),因为在判断语句中需要与后一位进行相邻比较。因此在此基础上需要减去1,不需要遍历全部,也避免了数组下标超出范(arr.length - i - 1)

选择排序(Selection Sort)

选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 

动态演示:

原理:将当前元素i与i之后的每个元素进行比较,获得最小(大)的值

代码演示:

package sort;
/**
 * Author:FengWenSheng
 * Date:Mar 1, 2019
 * Description:Sort03.java
 */
public class Sort03 {
	/**
	 * 选择排序
	 * */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/**
		 * 原理:将当前元素i与数组剩余元素进行比较,获得最小(大)的值
		 * 如第一层循环的第1次循环时,将第1个元素与第2,3...n个元素进行比较,并交换获得每次比较的最小(大)值
		 * 这时第一个元素的为数组中最小(大)的一个,直至所有元素排列完毕
		 * 而实际上排列至最后第二个时,最后一个元素位置已经可以确定,因此可以将第一层循环的arr.length改写为arr.length - 1
		 * 第一层循环为遍历的元素个数
		 * 第二层循环用于比较数组中最小(大)的一个元素
		 * 因为是从第i个元素与i后面的元素进行比较,遍历时j = i + 1,
		 * */
		int[] arr = {2,4,1,3};
		for (int i = 0; i < arr.length - 1; i++) {
			
			for (int j = i + 1; j < arr.length; j++) {
				
				if (arr[i] > arr[j]) {
					int idx = arr[i];
					arr[i] = arr[j];
					arr[j] = idx;
				}
				
			}

		}
		
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}

}

如第一层循环的第1次循环时,将第1个元素与第2,3...n个元素进行比较,并交换获得每次比较的最小(大)值,这时第一个元素的为数组中最小(大)的一个,直至所有元素排列完毕。而实际上排列至最后第二个时,最后一个元素位置已经可以确定,因此可以将第一层循环的arr.length改写为arr.length - 1。第一层循环为遍历的元素个数,第二层循环用于比较数组中最小(大)的一个元素,因为是从第i个元素与i后面的元素进行比较,遍历时j = i + 1

你可能感兴趣的:(算法/数据结构,排序算法)