1.插入排序
插入排序可以看做是,在一个已经有序的序列中在插入一个,使得它还是有序的。
简单的实现:
public int[] insertSort(int a[]) {
}
2.快速排序
public static void Quick_Sort(int a[], int left, int right) { // 起始、结束位置
int tmp, i, j, temp;
i = left + 1;
j = right;
tmp = a[left];
while (i < j) {
while (a[i] <= tmp && i <= j)
i++;
while (a[j] >= tmp && j >= i)
j--;
if (i < j) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
// count++;
i++;
j--;
}
}
if (left != j) {
a[left] = a[j];
a[j] = tmp;
// count++;
}
if (left < j - 1)
Quick_Sort(a, left, j - 1);
if (j + 1 < right)
Quick_Sort(a, j + 1, right);
}
---------转载堆排序-----------
堆排序
堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。
1.堆
堆实际上是一棵完全二叉树,其任何一非叶节点满足性质:
Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]或者Key[i]>=Key[2i+1]&&key>=key[2i+2]
即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。
堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为大顶堆,满足 Key[i]<=key[2i+1]&&Key[i]<=key[2i+2]称为小顶堆。由上述性质可知大顶堆的堆顶的关键字肯定是所有关键字中最大的,小顶堆的堆顶的关键字是所有关键字中最小的。
2.堆排序的思想
利用大顶堆(小顶堆)堆顶记录的是最大关键字(最小关键字)这一特性,使得每次从无序中选择最大记录(最小记录)变得简单。
其基本思想为(大顶堆):
1)将初始待排序关键字序列(R1,R2....Rn)构建成大顶堆,此堆为初始的无须区;
2)将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,......Rn-1)和新的有序区(Rn),且满足R[1,2...n-1]<=R[n];
3)由于交换后新的堆顶R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,......Rn-1)调整为新堆,然后再次将R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2....Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到有序区的元素个数为n-1,则整个排序过程完成。
操作过程如下:
1)初始化堆:将R[1..n]构造为堆;
2)将当前无序区的堆顶元素R[1]同该区间的最后一个记录交换,然后将新的无序区调整为新的堆。
因此对于堆排序,最重要的两个操作就是构造初始堆和调整堆,其实构造初始堆事实上也是调整堆的过程,只不过构造初始堆是对所有的非叶节点都进行调整。
下面举例说明:
给定一个整形数组a[]={16,7,3,20,17,8},对其进行堆排序。
首先根据该数组元素构建一个完全二叉树,得到
public class TestHeapSort {
/**
* @param args
*/
public static void main(String[] args) {
int[] a = {5,6,2,8,1,9,4,3,7};
heapSort(a);
for(int i = 0; i < a.length; i++){
System.out.println(a[i]);
}
}
public static void heapSort(int[] a){
int size = a.length;
//构建堆
builtHeap(a);
//将堆变成有序数
for(int i = size - 1; i >= 0; i--){
int temp;
temp = a[0];
a[0] = a[i];
a[i] = temp;
adjustHeap(a,0, i - 1);
}
}
public static void builtHeap(int[] a){
int size = a.length;
for(int i = (size - 1)/2; i >= 0; i--){
adjustHeap(a,i,size - 1);
}
}
public static void adjustHeap(int[] a, int i, int size){
int left = i*2;
int right = i*2 + 1;
int max = i;
if(i*2 <= size){
if(left <= size && a[left] > a[max]){//与其左儿子比较
max = left;
}
if(right <= size && a[right] > a[max]){//与其右儿子比较
max = right;
}
if(max != i){
int temp;
temp = a[i];
a[i] = a[max];
a[max] = temp;
adjustHeap(a, max, size);//调整其后面子堆,以防其不是堆
}
}
}
}