版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
排序算法总结
- 我们先写一个交换方法,减少代码量
private static void swap(int a, int b) {
int swap = a;
a = b;
b = swap;
}
冒泡排序
原理
形象的把排序过程比喻成水中的泡泡向上冒,它重复的走访过要排序的元素列,一次比较两个相邻的元素,如果他们的顺序不符合我们的规定,那么进行交换。重复的走访直到没有相邻元素要进行交换,也就是元素列,已经完成排序。
图解过程
代码如下
public static int[] sortArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
//内循环终止条件为数组长度减外循环i值,减少了重复的排序
for (int j = 1; j < arr.length - i; j++) {
if (arr[j - 1] < arr[j]) {
// 冒泡排序:每次比较相邻元素
swap(arr[j - 1], arr[j]);//调用交换方法
}
}
}
return arr;
}
选择排序
原理
和冒泡排序一样通过名称就可以知道他是通过选择两个元素进行比较,让每一个元素依次和其他元素进行比较,如果不满足条件就交换位置,知道所有元素全部排序完成
图解过程
代码如下
public static int[] sortArray2(int[] arr) {
// 选择排序:从第i个开始一次和后面的比较
for (int i = 0; i < arr.length - 1; i++) {
//内循环开始位置是i+1,减少重复的排序
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] < arr[j]) {
swap(arr[i], arr[j]);//调用交换方法
}
}
}
return arr;
}
插入排序
插入排序
简单直观,将待插入元素依次插入已排好的元素列中,在插入的时候依次与排好序的元素列元素进行比较大小,记录插入点,如果不满足条件就进行交换
图解插入:
代码如下:
public static int[] sortArray3(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];// 记录待插入元素
int insertPos = -1;// 初始化待插入点位置
for (int j = i - 1; j >= 0; j--) {
if (arr[j] > temp) {
arr[j + 1] = arr[j];// 移动元素
insertPos = j;// 更换(继续寻找)插入点
} else {
break;
}
}
if (insertPos != -1) {
arr[insertPos] = temp;// 在插入点插入
}
}
return arr;
}
快速排序
原理
简称快排,顾名思义他的排序效率是非常最快的,他通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
图解过程
代码
// 快速排序
public static void sortArray4(int[] arr, int left, int right) {
// 进行判断,如果左边索引比右边索引大,是不合法的
if (left > right) {
return;
}
// 定义变量保存基准数
int base = arr[left];
// 定义i、j指向左边、右边
int i = left;
int j = right;
// 当i和j不相遇进行检索
while (i != j) {
// 向由j从右向左检索比基准数小的,如果检索到比基准数小的数就停下
while (arr[j] >= base && i < j) {
j--;// j从右向左移动
}
// i从左向右检索比基准数大的数,检索到就停下
while (arr[i] <= base && i < j) {
i++;
}
//到这里i和j都停下了,就进行交换对应元素的位置
swap(arr[i], arr[j]);
}
//如果上面while循环条件不成立,会跳出循环往下执行,说明i和j相遇了,就把基准数和这相遇位置元素交换
arr[left]=arr[i];
arr[i]=base;
//基准数就归位了,归位后左边都比它大,右边都比他小
//在分别对基准数左右进行如上操作,层层递归
sortArray4(arr,left,i-1);
sortArray4(arr,j+1,right);
}
效率比较
排序方法 | 最好时间 | 平均时间 | 最坏空间 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|
冒泡 | O(n) | O(n*n) | O(n*n) | O(1) | 稳定 |
选择 | O(n*n) | O(n*n) | O(n*n) | O(1) | 不稳定 |
插入 | O(n) | O(n*n) | O(n*n) | O(1) | 稳定 |
快排 | O(nlgn) | O(nlgn) | O(n*n) | O(lgn) | 不稳定 |
通过测试排序发现了,快排效率最快,java.util.Arrays类中也是使用快速排序。