目前研二,看着研三师兄们找工作的心酸,突然感到比较迷茫。虽然学术科研渐入佳境,但仔细想来,一年以后自己如何找到理想的工作?略作规划之后,开始学习数据结构数算法,学习过程中的一些心得总结下来。
1、内部排序概述
排序(Sorting)是计算机程序设计中的一个重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。
由于待排序的记录数量不同,使得排序过程涉及的存储器不同,将排序方法分为两大类。
内部排序:待排序记录存放在计算机随机存储器中进行的排序过程。
外部排序:待排序记录的数量很大,以至内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。
先来总结一下各种排序之间的关系:
综合比较各种内部排序算法,大致结果如下:
从上表可以得出如下结论:
1. 从平均时间性能而言,快速排序最佳,其所需时间最省,但快速排序在最坏情况下的时间性能不如堆排序和归并排序。
2. 上表中简单排序包括除希尔排序之外的所有插入排序,起泡排序和简单选择排序,其中以直接插入最为简单,当序列的记录“基本有序”或 n 较小时,它是最佳的排序方法。
3. 从方法稳定性来比较,基数排序是稳定的内部排序,所有时间复杂度为O(n^2)的简单排序方法也是稳定的。然而,快速排序、堆排序和希尔排序等时间性能较好的排序方法是不稳定的。
下面用java语言实现各种内部排序。
(1) 插入排序
1、直接插入排序
概念:是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好的有序表中,从而得到一个新的有序表。
基本思想:在要排的一组数中,假设前面(n-1) , n>=2 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得n个数也是排好顺序的。如此循环,直到排好顺序.
实例
Java实现
int[] a = { 1, 54, 6, 3, 78, 34, 12, 45, 56, 100 };
public static int[] insertSort(int[] a) {
// TODO Auto-generated method stub
int temp = 0;
for (int i = 1; i < a.length; i++) {
temp = a[i];
int j = i - 1;
for (; j >= 0 && temp < a[j]; j--) {
a[j + 1] = a[j]; // 如果temp < a[j], 则整体后移
}
a[j + 1] = temp;
}
return a;
}
2、希尔排序
概念
希尔排序又称“缩小增量排序”,也是一种插入排序类的方法,但时间效率上较前述几种排序方法大为改进。基本思想
算法先将要排序的一组数按某个增量d(n/2,n为要排序数的个数)分成若干组,每组中记录的下标相差d.对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。当增量减到1时,进行直接插入排序后,排序完成。实例
基本实现
int[] a = { 49, 38, 65, 97, 76, 13, 27, 49, 55, 4 };
// 希尔排序
private static int[] shellSort(int[] a) {
// TODO Auto-generated method stub
int N = a.length;
int h = N / 2;
while (h >= 1) {
for (int i = h; i < a.length; i++) {
System.out.println("h = " + h + " i=" + i );
for (int j = i; j >= h && a[j] < a[j - h]; j -= h) {
int temp = a[j];
a[j] = a[j - h];
a[j - h] = temp;
System.out.println("j = " + j);
}
System.out.println(Arrays.toString(a));
}
h = h / 2;
}
return a;
}
运行结果
h = 5 i=5
j = 5
[13, 38, 65, 97, 76, 49, 27, 49, 55, 4]
h = 5 i=6
j = 6
[13, 27, 65, 97, 76, 49, 38, 49, 55, 4]
h = 5 i=7
j = 7
[13, 27, 49, 97, 76, 49, 38, 65, 55, 4]
h = 5 i=8
j = 8
[13, 27, 49, 55, 76, 49, 38, 65, 97, 4]
h = 5 i=9
j = 9
[13, 27, 49, 55, 4, 49, 38, 65, 97, 76]
h = 2 i=2
[13, 27, 49, 55, 4, 49, 38, 65, 97, 76]
h = 2 i=3
[13, 27, 49, 55, 4, 49, 38, 65, 97, 76]
h = 2 i=4
j = 4
j = 2
[4, 27, 13, 55, 49, 49, 38, 65, 97, 76]
h = 2 i=5
j = 5
[4, 27, 13, 49, 49, 55, 38, 65, 97, 76]
h = 2 i=6
j = 6
[4, 27, 13, 49, 38, 55, 49, 65, 97, 76]
h = 2 i=7
[4, 27, 13, 49, 38, 55, 49, 65, 97, 76]
h = 2 i=8
[4, 27, 13, 49, 38, 55, 49, 65, 97, 76]
h = 2 i=9
[4, 27, 13, 49, 38, 55, 49, 65, 97, 76]
h = 1 i=1
[4, 27, 13, 49, 38, 55, 49, 65, 97, 76]
h = 1 i=2
j = 2
[4, 13, 27, 49, 38, 55, 49, 65, 97, 76]
h = 1 i=3
[4, 13, 27, 49, 38, 55, 49, 65, 97, 76]
h = 1 i=4
j = 4
[4, 13, 27, 38, 49, 55, 49, 65, 97, 76]
h = 1 i=5
[4, 13, 27, 38, 49, 55, 49, 65, 97, 76]
h = 1 i=6
j = 6
[4, 13, 27, 38, 49, 49, 55, 65, 97, 76]
h = 1 i=7
[4, 13, 27, 38, 49, 49, 55, 65, 97, 76]
h = 1 i=8
[4, 13, 27, 38, 49, 49, 55, 65, 97, 76]
h = 1 i=9
j = 9
[4, 13, 27, 38, 49, 49, 55, 65, 76, 97]