1、堆排序是对选择排序的改进;
2、快速排序由两步骤构成:建堆和筛选;
3、建堆其实就是n/2趟筛选,建堆完成后再进行n-1趟筛选即可完成排序;
4、算法的核心是筛选算法。
5、算法代码(排序结果为降序)如下:
public static void heap_sort(int [] arr, int arr_length){
//construct heap
for(int i = (arr_length - 1)/2; i >= 0; i--){
sx(arr, i , arr_length - 1);
}
//debug
System.out.println();
System.out.print("建堆后:");
for(int tmp : arr){
System.out.print(String.valueOf(tmp) + " ");
}
//n-1 times sx
for(int j = arr_length - 1; j >= 0; j--){
swap(arr, 0, j);
sx(arr, 0, j - 1);
}
}
//筛选算法
public static void sx(int [] arr, int parent, int end){
int flag = 0;
int min_sub_index = -1;
int left_sub = 2 * parent + 1;
int right_sub = 2 * parent + 2;
while(left_sub <= end && flag != 1){
if(right_sub <= end ){
if(arr[left_sub] < arr[right_sub]){
min_sub_index = left_sub;
}else{
min_sub_index = right_sub;
}
}else{
min_sub_index = left_sub;
}
if(arr[parent] > arr[min_sub_index]){
swap(arr, parent, min_sub_index);
parent = min_sub_index;
left_sub = 2 * parent + 1;
right_sub = 2 * parent + 2;
}else{
flag = 1;
}
}
}
public static void swap(int [] arr, int src, int destinate){
int tmp = arr[src];
arr[src] = arr[destinate];
arr[destinate] = tmp;
}
6、算法完整测试代码如下:
package ds_heap_sort;
import java.util.Random;
public class ds_heap_sort {
public static void main(String [] args){
//随机生成待排序数组
int [] target = new int[10];
for(int i = 0; i < 10; i++){
target[i] = new Random().nextInt(10);
}
System.out.print("排序前:");
for(int tmp : target){
System.out.print(String.valueOf(tmp) + " ");
}
heap_sort(target, target.length);
System.out.println();
System.out.print("排序后:");
for(int tmp : target){
System.out.print(String.valueOf(tmp) + " ");
}
}
public static void heap_sort(int [] arr, int arr_length){
//construct heap
for(int i = (arr_length - 1)/2; i >= 0; i--){
sx(arr, i , arr_length - 1);
}
//debug
System.out.println();
System.out.print("建堆后:");
for(int tmp : arr){
System.out.print(String.valueOf(tmp) + " ");
}
//n-1 times sx
for(int j = arr_length - 1; j >= 0; j--){
swap(arr, 0, j);
sx(arr, 0, j - 1);
}
}
//筛选算法
public static void sx(int [] arr, int parent, int end){
int flag = 0;
int min_sub_index = -1;
int left_sub = 2 * parent + 1;
int right_sub = 2 * parent + 2;
while(left_sub <= end && flag != 1){
if(right_sub <= end ){
if(arr[left_sub] < arr[right_sub]){
min_sub_index = left_sub;
}else{
min_sub_index = right_sub;
}
}else{
min_sub_index = left_sub;
}
if(arr[parent] > arr[min_sub_index]){
swap(arr, parent, min_sub_index);
parent = min_sub_index;
left_sub = 2 * parent + 1;
right_sub = 2 * parent + 2;
}else{
flag = 1;
}
}
}
public static void swap(int [] arr, int src, int destinate){
int tmp = arr[src];
arr[src] = arr[destinate];
arr[destinate] = tmp;
}
}
7、运行结果如下:
排序前:0 4 4 5 0 2 0 2 2 7
建堆后:0 0 0 2 4 2 4 2 5 7
排序后:7 5 4 4 2 2 2 0 0 0
排序前:3 3 8 6 8 1 1 3 8 9
建堆后:1 3 1 3 8 3 8 6 8 9
排序后:9 8 8 8 6 3 3 3 1 1
排序前:2 2 4 4 2 1 6 4 8 7
建堆后:1 2 2 4 2 4 6 4 8 7
排序后:8 7 6 4 4 4 2 2 2 1