3种简单排序:冒泡排序、选择排序和插入排序

1 冒泡排序

1.1 实现原理和过程

冒泡排序是所有排序中最基本的一种,其核心思想是交换排序,通过相邻数据的交换来达到排序目的,缺点是效率低,时间复杂度为O(n^2)。具体过程如下:(1)依次比较数组中相邻两个元素的大小 (2)如果前面的数据大于后面的数据,则交换这两个数据,经过一轮排序后,最大的数据就会占用数组最后一个位置。依此类推就可以实现升序排序。

1.2 完整代码

public class BubbleSort {
	/**
	 * 冒泡排序
	 * @param arr
	 */
	public static void bubbleSort(int[] arr) {
		int temp; // 临时变量,用于交换
		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]) { // 将大的元素置换在后面
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
	}
	
	/**
	 * 测试
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// 初始化数组
		int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 1, 2 };


		// 测试冒泡排序
		bubbleSort(arr);
		System.out.println("冒泡排序的结果:" + Arrays.toString(arr));
	}
}


1.3 测试结果



2 选择排序

2.1 实现原理和过程

选择排序算法是通过选择和交换来实现排序,因为交换的次数减少,因此选择排序优于冒泡排序,但时间复杂度仍为O(n^2)。具体过程如下:1)假定a[0]为最小值min,与其他元素进行比较 2)若其他元素a[j]比min大则用临时变量记录下该坐标,并把a[j]赋予min,经次一轮,则可以获取最小元素的值和位置,并将其与a[0]进行互换,依此类推就可以实现升序排序。

2.2 完整代码

public class SelectionSort {
	/**
	 * 选择排序 
	 * @param arr
	 */
	public static void selectionSort(int[] arr) {
		for (int i = 0; i < arr.length - 1; i++) {
			int min = arr[i];
			int temp;
			int index = i;
			for (int j = i + 1; j < arr.length; j++) { // 找出最小的坐标
				if (min > arr[j]) {
					index = j;
					min = arr[j];
				}
			}
			temp = arr[i]; // 元素交换
			arr[i] = min;
			arr[index] = temp;
		}
	}
	
	/**
	 * 测试
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// 初始化数组
		int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 1, 2 };


		// 测试选择排序
		selectionSort(arr);
		System.out.println("选择排序的结果:" + Arrays.toString(arr));
	}


}

2.3 测试结果

 


3 插入排序

3.1 实现原理和过程

插入排序原理是通过对未排序的数据执行逐个插入至合适的位置而完成排序工作。当数组中存在较多局部有序数据时,插入排序的效果明显优于冒泡排序和选择排序,但时间复杂度仍为O(n^2)。具体过程如下:比较前2个数,如果第2个数大于第1个数,则将第二个数插入到a[1]位置,使得大的数据在右边。同理将第3个数插入合适位置,直到所有数据都插完为止,依此类推就可以实现升序排序。

3.2 完整代码

public class InsertionSort {


	/**
	 * 插入排序
	 * @param arr
	 */
	public static void insertSort(int[] arr) {
		int temp,j,i;
		for(i = 1; i < arr.length; i++){
			temp = arr[i];	//待插入的元素
			for(j = i-1; j >= 0 && arr[j] > temp; j--){	//待插入元素若比局部有序的元素小,则进行交换
				arr[j + 1] = arr[j];	//将数值较大的元素向后移动 
			}
			arr[j + 1] = temp;  //插入元素
		}
	}


	
	/**
	 * 测试
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// 初始化数组
		int[] arr = { 10, 9, 8, 7, 6, 5, 4, 3, 1, 2 };


		// 测试插入排序
		insertSort(arr);
		System.out.println("插入排序的结果:" + Arrays.toString(arr));
	}


}

3.3 测试结果

 

4 参考文献

[1] Robert, Lafore., Java数据结构和算法.第2版 版. 2004: 中国电力出版社.
[2] Sedgewick Robert与Wayne  Kevin., 算法. 2012: 人民邮电出版社.



原创文章 32 获赞 12 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_35469756/article/details/77923975