目录
排序的概念:
排序:
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性:
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持 不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳 定的;否则称为不稳定的(稳定可以转换成不稳定的,不稳定不可以转换成稳定的)。
内部排序:
数据元素全部放在内存中的排序。
外部排序:
数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
常见的排序算法:
直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序。
排序算法的实现:
说明:由于swap函数经常出现,为了使文章更加整洁,这里给出源码,下文直接调用不在说明。
private static void swap(int[] array,int i,int j){
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
插入排序:
思路:在待排序的元素中,假设前n-1个元素已有序,现将第n个元素插入到前面已经排好的序列中,使得前n个元素有序。按照此法对所有元素进行插入,直到整个序列有序。
动图演示如下:
代码实现如下:
public static void insertSort(int[] array){
for(int i = 1;i < array.length; i++){
int j = i-1;
int tmp = array[i];
for(;j >= 0; j--){
if(array[j] > tmp){
array[j+1] = array[j];
}else{
break;
}
}
array[j+1] = tmp;
}
}
结果演示:
直接插入排序的特性总结:
1. 元素集合越接近有序,直接插入排序算法的时间效率越高
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1),它是一种稳定的排序算法
4. 稳定性:稳定
希尔排序:
思路:希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成多个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达 =1时,所有记录在统一组内排好序。
动图演示:
代码实现如下:
在shellSort里面确定组的大小,在shell里面进行排序,通过计算确定gap的关系,间隔运行,一次通过。
public static void shellSort(int[] array){
int gap = array.length;
while(gap > 1){
gap /= 2;
shell(array,gap);
}
}
public static void shell(int[] array,int gap){
for(int i = gap; i < array.length; i++){
int j = 0;
j = i-gap;
int tmp = array[i];
for(;j >= 0;j -= gap){
if(array[j] > tmp){
array[j+gap] = array[j];
}else{
break;
}
}
array[j+gap] = tmp;
}
}
结果演示:
希尔排序的特性总结:
1. 希尔排序是对直接插入排序的优化。
2.