八大排序算法(Java版)

来源:互联网 发布:好scratch编程 编辑:程序博客网 时间:2024/06/06 19:02

一、排序分类

(1)插入排序:直接插入排序、希尔排序

(2)交换排序:冒泡排序、快速排序

(3)选择排序:简单选择排序、堆排序

(4)归并排序

(5)基数排序(分配排序)

二、算法思想及实现

1.直接插入排序

(1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的。

现在要把第n个数插入到前面的有序数列中,使得这 n个数也是排好顺序的。

如此反复循环,直到全部排好顺序为止。

(2)实例:序列T = (49,38,65,97,76,13,27,49)


(3)代码实现

// 直接插入排序public static void InsertSort(int[] a) {int length = a.length;int i, j;for (i = 2; i < length; i++) {if (a[i - 1] > a[i]) {a[0] = a[i];  // a[0]保持要插入的数据a[i] = a[i - 1];  // a[i]后移一位for (j = i - 2; a[j] > a[0]; j--) {a[j + 1] = a[j];  // 将大于a[0]的数整体后移一位}a[j + 1] = a[0];  // 注意这里是j + 1,因为循环结束时j--了}}}
由算法分析可知:

最好的情况下,其时间复杂度为O(n);最坏的情况下,其时间复杂度为O(n^2),且是稳定的排序。

2.折半插入排序

(1)基本思想:在给定的有序的表中查找数据或数据的插入位置,一次将查找范围缩至原有的一半,效率高。

(2)实例:序列T = (49,38,65,97,76,13,27,49)


(3)代码实现

// 折半插入排序public static void BinaryInsertSort(int[] a) {int length = a.length;int i, j;int low, high, mid;for (i = 2; i < length; i++) {if (a[i - 1] > a[i]) {a[0] = a[i];  // a[0]保持要插入的数据low = 1; high = i - 1;while (low <= high) {mid = (low + high) / 2;if (a[0] < a[mid]) {high = mid - 1;} else {low = mid + 1;}}for (j = i - 1; j >= high + 1; j--) {a[j + 1] = a[j];  // 将大于a[0]的数整体后移一位}a[high + 1] = a[0]; }}}
由算法分析可知:

最好的情况下,其时间复杂度为O(n);最坏的情况下,其时间复杂度为O(nlog2n),且是稳定的排序。

3.冒泡排序

(1)基本思想

(2)实例

(3)代码实现

3.冒泡排序

(1)基本思想

(2)实例

(3)代码实现

4.快速排序

(1)基本思想

(2)实例

(3)代码实现

5.简单选择排序

(1)基本思想

(2)实例

(3)代码实现

6.堆排序

(1)基本思想

(2)实例

(3)代码实现

7.归并排序

(1)基本思想

(2)实例

(3)代码实现

8.基数排序

(1)基本思想

(2)实例

(3)代码实现