排序算法(冒泡、选择、插入、希尔)
冒泡排序
重复遍历数列 每次都遍历都将两个数按照一样的顺序调过来 直到排序完成
//冒泡排序
public int[] bubble(int[] arr) {
int temp;
for (int i = 0; i < arr.length-1; i++) {
for (int j=0;j<arr.length-i-1;j++){
if (arr[j]>arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
选择排序
每次选择一个未排序序列中最小的元素 将其放置到数组前面 直到排序结束
//选择排序
public int[] choose(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int index = i; //记录每轮循环的起始元素位置
for (int j = i; j < arr.length; j++) {
//向后遍历,更新记录最小值
if (arr[index] > arr[j]) {
index = j;
}
}
//将每轮的最小值与本轮起始元素调换
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
return arr;
}
插入排序
插入排序首先构建一个基本有序序列,然后将没有排序的元素向已经排序的序列中插入,类似于打扑克牌时的排序方法。
//插入排序
public int[] insert(int[] arr) {
// 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
for (int i = 1; i < arr.length; i++) {
// 记录要插入的数据
int tmp = arr[i];
// 从已经排序的序列最右边的开始比较,找到比其小的数
int j = i;
while (j > 0 && tmp < arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
// 存在比其小的数,插入
if (j != i) {
arr[j] = tmp;
}
}
return arr;
}
希尔排序
希尔排序也称递减增量排序算法,首先找到一个增量,然后按照这个增量遍历数组排序,之后缩小增量继续排序,直到增量为1后排序结束
转自五分钟学算法的演示图
//希尔排序
public int[] shellSort(int[] arr) {
int length = arr.length; //数组长度
int temp; //临时变量
//将数组长度的一半作为第一次增量开始遍历 每轮都将增量折半递减
for (int step = length / 2; step >= 1; step /= 2) {
//用增量去向后遍历元素
for (int i = step; i < length; i++) {
temp = arr[i];//将每轮元素赋给临时变量
int j = i - step;//找到增量对应的前一个元素
while (j >= 0 && arr[j] > temp) { //将两个元素排序调换
arr[j + step] = arr[j];
j -= step; //如果增量结束则跳出,如果满足下一次排序条件 则继续按照增量向下排序
}
arr[j + step] = temp;//调换元素位置
}
}
return arr;
}
以上图片转自菜鸟教程