概念:将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。
分类:
- 内部排序:将需要处理的数据全部加载到内部存储器中进行排序
- 插入排序
- 插入排序
- 希尔排序
- 选择排序
- 选择排序
- 堆排序
- 交换排序
- 冒泡排序
- 快速排序
- 归并排序
- 基数排序
- 插入排序
- 外部排序:数量量过大,无法全部加载到内存中,需要借助外部存储进行排序
一、冒泡排序
- 思想:两个相邻元素进行比较交换
通过对待排序序列从前往后,依次比较相邻元素的值,若发现后一个比前一个大就进行交换,使得较大元素逐渐从前移向后部,就像是军训站队,高个子依次与后面的人进行比较交换位置。进行length-1次排序。
- 代码
// 冒泡排序
public static void sort(int[] arrs) {
int temp = 0;
// 进行length-1次比较
for (int i = 0; i < arrs.length - 1; i++) {
// 定义标志位,用于提前结束比较
boolean flag = true;
// 每次将最后排序好的数据排除
for (int j = 0; j < arrs.length - 1 - i; j++) {
// 如果前一个比后一个大就进行交换
if (arrs[j] > arrs[j + 1]) {
flag = false;
temp = arrs[j];
arrs[j] = arrs[j + 1];
arrs[j + 1] = temp;
}
}
// 结束比较
if (flag) {
break;
}
}
}
二、选择排序
- 思想:排序的元素依次与其他元素比较得出最小值与之交换。
第一次从arrs[0]arrs[n-1]中查找出最小值与arrs[0]进行交换。下一次从arrs[1]arrs[n-1]中查找出最小值与arrs[1]进行交换,依次执行n-1次。
- 代码
// 选择排序
public static void sort(int[] arrs) {
// 进行length-1次比较
for (int i = 0; i < arrs.length - 1; i++) {
// 定义最小值的下标
int minIndex = i;
// 取出当前要比较的元素
int min = arrs[minIndex];
// 与之后没有进行比较的元素依次比较得出最小值的下标
for (int j = i + 1; j < arrs.length; j++) {
// 如果比较的元素大于该元素交换下标和最小值
if (min > arrs[j]) {
minIndex = j;
min = arrs[j];
}
}
// 如果比较元素不是最小值,就将比较得出的值进行交换
if (minIndex != i) {
arrs[minIndex] = arrs[i];
arrs[i] = min;
}
}
}
三、插入排序
- 思想:将要排序的元素以插入的方式找寻该元素的适当的位置
把n个待排序的数组看成为一个有序表和一个无序表。有序表中有第一个元素,无序表中有n-1个元素。排序时从无序表中取出第一个元素,把它依次与有序表中进行比较,进行插入到适当位置。
- 代码
// 插入排序
public static void sort(int[] arrs) {
// 进行length-1次排序
for (int i = 1; i < arrs.length; i++) {
// 记录待插入的值
int insertVal = arrs[i];
// 记录待插入进行比较的位置(从尾部向前进行依次比较)
int insertIndex = i - 1;
// 如果插入的位置大于0(说明有位置考研插入)以及插入值小于有序表中元素(说明待插入值应该在前一位或更前面)
while (insertIndex >= 0 && insertVal < arrs[insertIndex]) {
// 将前面插入的位置空留出来给待插入的元素
arrs[insertIndex + 1] = arrs[insertIndex];
insertIndex--;
}
// insertIndex对应的是前一个比较元素的位置
arrs[insertIndex + 1] = insertVal;
}
}