一、衡量排序算法的优劣:
- 时间复杂度:分析关键字的比较次数和记录的移动次数
- 空间复杂度:分析排序算法中需要多少辅助内存
- 稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。
例:A1,A2.它们的索引分别为1,2.则排序之后A1,A2的索引仍然是1和2.
二、排序算法的分类:
-
内部排序
整个排序过程不需要借助于外部存储器(如磁盘等),所有排 序操作都在内存中完成。
-
外部排序
参与排序的数据非常多,数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。外部排序最常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。
三、十大内部排序算法
- 选择排序 (直接选择排序、堆排序)
- 交换排序 (冒泡排序、快速排序)
- 插入排序 (直接插入排序、折半插入排序、Shell排序)
- 归并排序
- 桶式排序
- 基数排序
冒泡排序
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
每一趟进行的过程:从第-一个元素开始,比较两个相邻的元素。若相邻的元素的相对位置不正确,则进行交换;否则继续比较下面两个相邻的元素.
package day06;
public class Demo {
public static void main(String[] args) {
int[] arr = new int[] { 43, 59, 68, 87, 99, 124, 58, 77, 66, 33, 333, 254, 15 };
// 冒泡排序
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
}
}
其他排序:https://download.youkuaiyun.com/download/ssINT/13210107