程序员都知道的排序算法合集

1.1 冒泡排序原理

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。1
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 1
  3. 针对所有的元素重复以上的步骤,除了最后一个。 1
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 一个具有注脚的文本。1

举个例子

利用冒泡排序对下面 n 个元素按照从大到小的顺序进行排序: (1,5,3,9,12,7,15,10)

动画演示

对于例中的 n 个元素的排序过程如下:

在这里插入图片描述
Tip: 相邻元素比较次数为 n-1 次

Java语言实现

public class Sort {
	public static void bubbleSort(int[] arr) {
		for(int i = 0; i < arr.length; i++) {
			boolean flag = false;
			for(int j = 0; j < arr.length-1; j++) {
				if(arr[j] < arr[j+1]) {
					int t = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = t;
					flag = true;
				}
			}
			if(flag == false){
				break;
			}
		}
	}
}

Tip: 这里使用 flag 来处理已经排序好的情况

测试结果

public class Test {
	public static void main(String[] args) {
		int[] arr = new int[]{1,5,3,9,12,7,15,10};
		Sort.bubbleSort(arr);
		for(int a: arr) {
			System.out.println(a);
		}
	}
}/*output:
[15, 12, 10, 9, 7, 5, 3, 1]
*/

时间复杂度分析

最好的情况下:元素已经按照大小顺序排序,只需要比较 n-1 次,时间复杂度为 O(n)

最坏的情况下:元素按照倒序排序,需要执行 n (n - 1) 次比较,时间复杂度为O( n2 )


1.2 选择排序原理

在未排序的序列中找到最大(最小值)依次有序放入排序好的序列中。

举个例子

利用选择排序对下面 n 个元素按照从大到小的顺序进行排序: (1, 5, 3, 9, 12, 7, 15, 10)

动画演示

在这里插入图片描述

Java语言实现

public class Sort {
	public static void selectSort(int[] arr) {
		int maxId;
		for(int i = 0; i < arr.length; i++) {
			maxId = i;
			for(int j = i+1; j < arr.length; j++) {
				if(arr[j] > arr[maxId]) {
					maxId = j;
				}
			}
			int t = arr[i];
			arr[i] = arr[maxId];
			arr[maxId] = t;
		}
	}
}

测试结果

import java.util.Arrays;

public class Test {
	public static void main(String[] args) {
		int[] arr = new int[] {1, 5, 3, 9, 12, 7, 15, 10};
		Sort.selectSort(arr);
		System.out.println(Arrays.toString(arr));
	}
}/*output:
[15, 12, 10, 9, 7, 5, 3, 1]
*/

时间复杂度分析

选择排序无论是哪个元素进去,都要进行两次循环操作,所以时间复杂度为 O(n2)


  1. 参考资料:吕新平、刘宏铭.二级公共基础知识实战训练教程:西安交通大学出版社,2006.02 ↩︎ ↩︎ ↩︎ ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章