1.直接选择排序
相比冒泡排序,会大大减少交换次数
思想:找到n个元素中最小的一个数放置在数组首位,再在剩余n-1个数中选取最小的放在数组的第二位,以此类推。
import java.util.Arrays;
public class SelectSort {
public static void selectsort(int[] arr){
for(int i = 0;i<arr.length-1;i++){
int index = i; //设置索引index指向最小元素
int j;
for (j=i+1;j<arr.length-1;i++){
if(arr[index]>arr[j]){
index = j;
}
}
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
}
public static void main(String[] args) {
int[] arr = {1,2,3,5,7,2,9,0,5};
selectsort(arr);
for (int i:arr
) {System.out.println(arr[i]);
}
}
}
2.插入排序
数据总量庞大时,可以用链表解决问题
思想:将无序数组插入有序数组中。先将数组看成只有首个元素,其次添加第二个元素并在数组中找到合适位置插入,按此法将剩余元素依次插入。当所有元素插入之后即可得到结果。
public static void insertion(int arr[]) { //插入排序
for(int i=2;i<arr.length;i++){ //i代表本次循环中元素的个数
int temp = arr[i-1]; //定义临时变量temp存放新插入的数
for(int j=i-1;j>1;j--){ //j代表同新插入元素arr[i-1]相比较的元素下标
if(temp<arr[j-1]){//依次比较当新插入数<arr[j-1]时后面数组下标+1
arr[j] = arr[j-1];
arr[j-1] = temp;
}
else { //否则不用前移
arr[j] = temp;
break;}
}
}
}
3.希尔排序
数组基本有序的情况下,是直接插入算法的优化
思想:先设置一个较大的增量,再将数列按增量分组,对每组使用直接插入算法。再设置一个小于原先增量的增量,实施同样操作。当增量减为1后,排序得到的结果即最终结果(增量为1时相当于将一个基本有序的数列进行直接插入排序)
public static void shell(int[] arr){
int increaseNum =arr.length/2; //设置增量
while(true){
for(int i=0;i<arr.length;i++) { //将数组分为n组
for(int j=i;j<arr.length;j+=increaseNum){ //得到每组的确切值
for(int k=j;k-increaseNum>0;k-=increaseNum){
int temp = arr[j]; //定义中间变量temp存放新插入的值
if(arr[k-increaseNum]>temp){
arr[k] = arr[k-increaseNum];
}
else {
break;
}
arr[k-increaseNum] = temp;
}
}
}
if(increaseNum == 1){
break;
}
increaseNum=increaseNum/2;
}
}
这个其实不难,但就是就是写起来有点恶心。毕竟三重循环脑子里不容易绕过来,很容易在边界和覆盖方面出问题。
4.快速排序
冒泡排序的升级,已知最快的排序方法