目录索引 :
选择排序(Selection Sort)
选择排序就是给定一组数,将该组数按照从小到大的顺序进行排序的算法.
排序思路 :
循环数组,将每次循环中的数与其它数进行比对,得到每次循环中最小的一个数,进行索引位置交换,一直到循环完成,比如:
代码实现 :
public static void main(String[] args){
System.out.println("Not Srot Array.{3,2,8,6,4,7,1,9,10}");
int[] arr = {3,2,8,6,4,7,1,9,10,0};
selectionSort(arr);
System.out.println("Srot Array :");
for(int i = 0 ; i < arr.length ; i++){
System.out.print(arr[i]+" ");
}
}
private static void selectionSort(int[] arr){
int length = arr.length;
for(int i = 0 ; i < length ; i++){
int minIndex = i ; // minIndex 为当前最小索引,用于后面的寻找最小数
for(int j = i + 1 ; j < length;j ++){ // 开始第一轮的循环,找出未排序元素中最小的数
if(arr[j] < arr[minIndex]){ // minIndex 的数大于当前循环到的arr[j]的数,则将minIndex设置为j,这样minIndex就是最小的
minIndex = j;
}
}
swap(arr,i,minIndex); // 通过swap互换对应i和minIndex位置的元素
}
}
/*
* swap 将指定index的索引元素,
* 插入到另一个指定索引元素的位置
*/
private static void swap(int[] arr,int i,int j){
int t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
插入排序 (Insertion Sort):
插入排序就是将数组待排数据按其大小插入到已经排序的数据中的适当位置.插入排序分为直接插入排序和折半插入排序两种.
比如下图:
代码实现如下:
private static void insertionSort(int[] arr){
int length = arr.length;
for(int i = 1 ; i < length ; i++){ // 循环开始,默认第一个元素不动
for(int j = i ; j > 0 ; j --){ // 将循环到的元素与前面有序的元素进行对比,如果小于前一个元素则向前移动
if(arr[j] > arr[j - 1]){ // 将寻到的第n到元素,与前面已排序完成的元素进行对比,一直遇到比它小的元素则break
swap(arr,j,j-1);
}else
break;
}
}
}
上面的这种方式其实效率是比较低的,因为每次循环到一个元素之后,都要与前一个元素进行位置交换 .
优化后的插入排序:
private static void insertionSort_SEO(int[] arr){
int length = arr.length;
for(int i = 0 ; i < length ; i++){ // 循环遍历每一个元素
int e = arr[i]; // 记录下循环到的索引元素值
int j = i ;
for( ; j > 0 ; j --){ // 循环并比对已排序的序列,并将值插入合适的位置
if(arr[j] > e){ // 如果当前循环到的索引值比它的前一位的索引值大,那么将二者的索引位置交换
arr[j] = arr[j - 1]; // 交换索引位置,并再次循环
}
}
arr[j] = e ; // 最终将e赋值给最左边比它大的元素
}
}