1,插入排序
①,直接插入排序:有序去与无序区,无序区的元素直接插入有序区
②,希尔排序,增量缩小法,知道增量为1
2,快速排序
①,冒泡排序
②,快速排序,寻找中间点,左右递归
3,选择排序
①直接选择,划分无序和有序区,将无序区的最小值与无序区的首元素交换,有序区元素个数增1
②,堆排序
4,归并排序
5,基数排序
还有个动态画面演示:http://sjjg.js.zwu.edu.cn/SFXX/sf1/sfys1.4.html
----------------------------------堆排序-------------------------------------------
堆排序算法的思想是:(假设数据放在一个数组a中,且数组的长度是N)
1:以数组a为数据,建立一个大顶堆(这样对于二叉树的每个节点,根节点总是比子节点大,其实没必要要求二叉树的每个子树也是大顶堆)
2:交换大顶堆的根节点和数组a中的最后一个节点(最后一个节点不在参与后边的工作)
重复上边的工作,经过N-1次后,数组a已经排好序。
堆排序算法的java实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
public
static
void
heapSort(
int
[] elements){
for
(
int
i = elements.length-
1
; i >
0
; i--){
buildHeap(elements,i);
//建堆
swap(elements,
0
,i);
//交换根节点和最后一个节点
}
}
//建堆
private
static
void
buildHeap(
int
[] elements,
int
lastIndex){
int
lastParentIndex = (lastIndex-
1
)/
2
;
//获得最后一个父节点
for
(
int
i = lastParentIndex; i >=
0
; i--){
int
parent = elements[i];
int
leftChild = elements[i*
2
+
1
];
//左节点肯定存在
int
rightChild = leftChild;
if
(i*
2
+
2
<=lastIndex){
rightChild = elements[i*
2
+
2
];
//右节点不一定存在
}
int
maxIndex = leftChild<rightChild?i*
2
+
2
:i*
2
+
1
;
if
(parent < elements[maxIndex]){
swap(elements,i,maxIndex);
}
}
}
private
static
void
swap(
int
[] elements,
int
firstIndex,
int
secondIndex){
int
temp = elements[firstIndex];
elements[firstIndex] = elements[secondIndex];
elements[secondIndex] = temp;
}
|