排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说说八大排序就是内部排序。
日常操作中常见的排序方法有:插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、基数排序等。
一、插入排序
1 原理
插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
每步将一个待排序的记录,按其顺序码大小插入到前面已经排序的字序列的合适位置(从后向前找到合适位置后),直到全部插入排序完为止。
2 实现步骤
经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中。
(1)将第一个数和第二个数排序,然后构成一个有序序列
(2)将第三个数插入进去,构成一个新的有序序列。
(3)对第四个数、第五个数……直到最后一个数,重复第二步。
3 实现逻辑
(1)首先设定插入次数,即循环次数,for(int i=1;i<length;i++),1个数的那次不用插入。
(2)设定插入数和得到已经排好序列的最后一个数的位数。insertNum和j=i-1。
(3)从最后一个数开始向前循环,如果插入数小于当前数,就将当前数向后移动一位。
(4)将当前数放置到空着的位置,即j+1。
4 代码实现
public void insertSort(int[] numbers){
int size = numbers.length;//数组长度,将这个提取出来是为了提高速度。
int insertNum;//要插入的数
for(int i = 1;i<size ;i++){
//插入的次数
insertNum=numbers[i];//要插入的数
int j=i-1;//已经排序好的序列元素个数
//序列从后到前循环,将大于insertNum的数向后移动一格
while(j>=0&&numbers[j]>insertNum){
numbers[j+1]=numbers[j];//元素移动一格
j--;
}
numbers[j+1]=insertNum;//将需要插入的数放在要插入的位置。
}
}
public void insertSort(int[] numbers){
int size = numbers.length;//数组长度,将这个提取出来是为了提高速度。
int insertNum= 0;//要插入的数
int j = 0;
for(int i = 0 ; i < size ; i++){
insertNum = numbers[i];//要插入的数
//假如insertNum比前面的值小,则将前面的值后移
for(j = i ; j > 0 && insertNum < numbers[j-1] ; j--){
numbers[j] = numbers[j-1];//元素移动一格
}
numbers[j] = insertNum;//将需要插入的数放在要插入的位置。
}
}
二、希尔排序
1 原理
希尔排序是1959 年由D.L.Shell 提出来的,相对直接排序有较大的改进。希尔排序又叫缩小增量排序。
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
2 实现步骤
对于直接插入排序问题,数据量巨大时。
(1)将数的个数设为n,取奇数k=n/2,将下标差值为k的书分为一组,构成有序序列。
(2)再取k=k/2 ,将下标差值为k的书分为一组,构成有序序列。
(3)重复第二步,直到k=1执行简单插入排序。
3 实现逻辑
(1)首先确定分的组数。
(2)然后对组中元素进行插入排序。
(3)然后将length/2,重复1,2步,直到length=0为止。
4 代码实现
public void shellSort(int[] a){
int d = a.length;
while (d!=0) {
d=d/2;
for (int x = 0; x < d; x++) {
//分的组数
for (int i = x + d; i < a.length; i += d) {
//组中的元素,从第二个数开始
int j = i - d;//j为有序序列最后一位的位数
int temp = a[i];//要插入的元素
for (; j >= 0 && temp < a[j]; j -= d) {
//从后往前遍历。
a[j + d] = a[j];//向后移动d位
}
a[j + d] = temp;
}
}
}
}
public static void shellSort(int[] data){
int j = 0;
int temp = 0;
//每次将步长缩短为原来的一半
for (int increment = data.leng