本文介绍3个简单的排序算法,它们的平均时间复杂度都是O(n2)。它们是其他高级排序算法学习的基础。它们分别是直接插入排序、冒泡排序和简单选择排序。
一、直接插入排序
基本思想:
将第一个元素看成是有序的,再依次从第二个记录起,逐个插入到这个有序序列里。例如如下序列:
>>12, 5, 3, 34, 42, 9, 36
第一步将12看成有序序列,插入第二个,5比12小,放在12前面。依次插入其他元素。效果如下:
>>12
>>5,12
>>3,5,12
>>3,5,12,34
>>3,5,12,34,42
>>3,5,9,12,34,42
>>3,5,9,12,34,36,42
一下是一段Java实现的代码
public static void sort(int[] array){
for (int i = 1; i < array.length; i++) {
int temp = array[i];
int j;
for (j = i-1; j >= 0 && temp < array[j]; j--) {
array[j+1] = array[j];
}
array[j+1] = temp;
}
}
二、冒泡排序
基本思想:
将序列中的第1个元素与第2个元素比较,若前者大于后者,则交换两个元素的位置,否则不交换;再将第2个元素与第3个元素比较,若前者大于后者,则交换两个元素的位置,否则不交换;依次类推,直到第n-1个元素与第n个元素比较(或交换)。经过一趟排序,使得n个元素的最大者被安置在第n个位置上。
冒泡排序算法的运作如下:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
那里介绍的很好。
对于序列>>12, 5, 3, 34, 42, 9, 36其执行过程如下
12 5 3 3 3 3 3 3
5 3 5 5 5 5 5
3 12 12 9 9 9
34 34 9 12 12
42 9 34 34
9 36 36
36 42
>>0 1 2 3 4 5 6 执行的趟数
以下是Java实现的代码
public static void sort(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 1; j < array.length - i; j++) {
if (array[j - 1] > array[j]) {
int t = array[j - 1];
array[j - 1] = array[j];
array[j] = t;
}
}
}
}
三、简单选择排序
基本思想:
从未排序序列中选择第i小的元素放到第i个位置上。也就是说,最开始选择最小的元素放到第一个位置,接着是次小的,依次类推,需要检索整个未排序的部分。但只要交换一次就将待排序元素放到正确的位置上。
对于序列>>12, 5, 3, 34, 42, 9, 36 执行过程如下:
>>12, 5, 3, 34, 42, 9, 36
>>3 (12 5 34 42 9 36)
>>3 5 (12 34 42 9 36)
>>3 5 9 (12 34 42 36)
>>3 5 9 12 (34 42 36)
>>3 5 9 12 34 (42 36)
>>3 5 9 12 34 36 42
下面是一段Java实现代码:
public static void sort(int[] array) {
for (int i = 0; i < array.length; i++) {
int low = i;
for (int j = i+1; j < array.length; j++) {
if (array[low] > array[j]) {
low = j;
}
}
{
int temp = array[low];
array[low] = array[i];
array[i] = temp;
}
}
}
以上三个排序方法都属于简单排序分别对应三类(插入排序、交换排序、选择排序)常用排序算法。他们实现都比较简单,但相对于一些高级排序,速度比较慢。