首页 > 编程语言 > 详细

插入排序

时间:2020-07-08 21:41:25      阅读:75      评论:0      收藏:0      [点我收藏+]

插入排序:

   数组实现:

   思路:先将当前值保存到value中,遍历之前的所有元素并且与其比较,如果num大于value,则将num往后移动一位覆盖value并继续比较前一个,直到value之前的某个值小于等于value时,结束遍历,并将value值赋给该值得后一个位置。从描述看出,插入排序是稳定的。

估计不好理解,看图说话:

技术分享图片

 

 

 具体代码:

 1     public static void insertSort(int[] nums) {
 2         int insertValue = 0;
 3         int insertIndex = 0;
 4         boolean flag=false;
 5         for (int i = 1; i < nums.length; i++) {
 6             insertValue = nums[i];// 保存当前需要插入到有序表的数值
 7             insertIndex = i - 1;// 表示要与当前数值进行比较的值的下标
 8             for (int j = insertIndex; j >= 0; j--) {// 在当前值的前面的有序表中遍历
 9                 if (nums[insertIndex] > insertValue) {// 如果待插入的值小于有序表中的某值(从后往前)
10                     nums[insertIndex + 1] = nums[insertIndex];// 那么就将某值后移
11                     insertIndex--;// 这里用于记录要插入的位置
12                 }
13             }
14 
15             nums[insertIndex + 1] = insertValue;// 因为真正的待插入的位置在遍历完是在待插入位置的前一个,所以要将待插入位置+1
16         }
17     }

   测试:

  插入排序的最坏情况下:时间复杂度为O(n2);最好情况下O(n)      空间复杂度:O(1)

  测试80000随机数,范围在1000w内的随机数。结果如下:

  前后差约为:5秒(同条件下相比冒泡提升了3倍以上的效率)

  before: 23:18:04:379

  after: 23:18:09:187

  链表实现:

 1 public static void insertSort(Node head) {
 2         if (null == head.getNext()) {
 3             return;
 4         }
 5         Node temp = head.getNext();
 6         while (temp != head) {
 7             temp = temp.getNext();
 8             if (temp == head)
 9                 break;
10             int insertValue = temp.getValue();
11             Node insertPointer = temp.getPre();
12             while (head != insertPointer) {
13                 if (insertPointer.getValue() > insertValue && insertPointer.getPre().getValue() <= insertValue) {
14                     insertPointer = insertPointer.getPre();
15 
16                     temp.getPre().setNext(temp.getNext());
17                     temp.getNext().setPre(temp.getPre());
18 
19                     Node insertNode = new Node(insertValue);
20                     insertNode.setNext(insertPointer.getNext());
21                     insertPointer.getNext().setPre(insertNode);
22                     insertPointer.setNext(insertNode);
23                     insertNode.setPre(insertPointer);
24 
25                     continue;
26                 }
27                 insertPointer = insertPointer.getPre();
28             }
29         }
30     }

可能自己书写不当,不推荐链表排序,同样80000个数,居然要1分钟才排好。。。看看就行了。学习链表其中的技巧。

插入排序

原文:https://www.cnblogs.com/taichiman/p/13268971.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!