几大基本排序算法原理

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值