排序算法
一、概念
排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
二、分类
三、排序
1.直接插入排序
分析:
通过构建有序序列,当要插入第i个元素时,前面的array[0]、array[1]、array[2]….,array[i-1]已经有序,然后用array[i]和之前的有序序列中的数依次进行比较,选择合适的位置插入,然后将插入位置的数顺序往后移。
步骤:
- 从第一个元素开始,认为第一个元素已经被排序
- 取出下一个元素,在已排好序的序列中从后往前扫描
- 如果该元素(已排好序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排好序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2-5
动画展示:
添加链接描述
代码实现:
import java.util.Arrays;
/**
* 直接插入排序
* (简单直观算法)
*/
public class insertSort {
private static void insertSort(int[] array){
for (int i = 1; i < array.length; i++) {
// 有序 [0, i)
// 无序 [i, array.length)
int key = array[i];
int j;
for (j = i - 1; j >= 0; j--) {
if (array[j] <= key) {
break;
} else {
array[j + 1] = array[j];
}
}
array[j + 1] = key;
}
}
public static void main(String[] args) {
int[] array = {
9,1,2,5,7,4,8,6,3,5};
insertSort(array);
System.out.println(Arrays.toString(array));
}
}
2.希尔排序
分析:
1.希尔排序是对直接插入排序的优化,它与直接插入排序不同之处在于,它会提前做一个预排序,给序列分组预排序,也叫做分组插排
2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序
动画展示:
添加链接描述
代码实现:
import java.util.Arrays;
/**
* 希尔排序
*/
public class insertSortWithGap {
//排序
private static void insertSortWithGap(int[] array, int gap) {
for (int i = 0; i < array.length; i++) {
int key = array[i];
int j = i - gap;
for (; j >= 0 && key < array[j]; j = j - gap) {
array[j + gap] = array[j];
}
array[j + gap] = key;
}
}
private static int[] shellSort(int[] array) {
int gap = array.length;
while (gap > 1) {
gap = gap / 2;
//gap = (gap / 3) + 1;
insertSortWithGap(array, gap);
if (gap == 1) {
break;
}
}
return array;
}
public static void main(String[] args) {
int [] array = {
9,1,2,5,7,4,8,6,3,5};
System.out.println(Arrays.toString(shellSort(array)));
}
}
3.选择排序
分析:
每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完
步骤1:
- 把要排序的序列分为有序序列和无序序列
- 遍历序列,每一次从无序序列找到最大元素,放到无序序列最后面,
- 直到无序区间内没有元素,也就是所有元素都排好序
步骤2:
- 把要排序的序列分为有序序列和无序序列
- 遍历序列,每一次从无序序列找到最小元素,放到无序序列最前面,
- 直到无序区间内没有元素,也就是所有元素都排好序
动画展示:
添加链接描述
代码实现:
import java.util.Arrays;
/**
* 选择排序
**/
public class SelectSort {
/**
* 选择排序
* 从无序序列找到最小元素,放到无序序列最前面
*/
private static int[] SelectSort(int[] array) {
for (int i = 0; i < array.length; i++) {
int min = i;
for (int