排序算法一二分排序

Posted loveer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法一二分排序相关的知识,希望对你有一定的参考价值。

二分插入排序

简介

二分排序是指利用二分法的思想对插入排序进行改进的一种插入排序算法,
可以利用数组的特点快速定位指定索引的元素。

二分法排序的思想

必须是有序数组

在插入第i个元素时,对前面的0~i-1元素进行折半,先跟他们中间的那个元素比,

如果小,则对前半再进行折半,否则对后半进行折半,直到left>right,找到位置

然后再把第i个元素前1位与目标位置之间的所有元素后移,再把第i个元素放在目标位置上。

复杂度
二分排序的时间复杂度是O(logn),
空间复杂度O(1),是稳定排序。
技术图片
 
 1 class binary 
 2     //循环查找
 3     public static int search1(int[] arr, int count) 
 4         //长度
 5         int len = arr.length;
 6         //边界
 7         int left = 0, right = len - 1;
 8         //中间
 9         int mid = 0;
10         while (left <= right) 
11             mid = (left + right) / 2;
12             if (arr[mid] > count) 
13                 right = mid - 1;
14              else if (arr[mid] < count) 
15                 left = mid + 1;
16              else 
17                 return mid;
18             
19         
20         return -1;
21     
22 
23     //递归查找
24     public static int search2(int[] arr, int left, int right, int count) 
25         if (left <= right && arr[left] <= count && arr[right] >= count) 
26             //中间
27             int mid = (left + right) / 2;
28             if (arr[mid] > count) 
29                 right = mid - 1;
30                 return search2(arr, left, right, count);
31              else if (arr[mid] < count) 
32                 left = mid + 1;
33                 return search2(arr, left, right, count);
34              else if (arr[mid] == count) 
35                 return mid;
36             
37 
38         
39         return -1;
40     
41 
42     //二分排序
43     public static void binarySort(int[] arr) 
44         for (int i = 1; i < arr.length; i++) 
45             //有序的第一个
46             int left = 0;
47             //有序的最后一个
48             int right = i - 1;
49             //中间值
50             int mid = 0;
51             int temp = arr[i];
52             //寻找位置
53             while (left <= right) 
54                 mid = (left + right) / 2;
55                 if (arr[mid] > temp) 
56                     right = mid - 1;
57                  else if (arr[mid] <= temp) 
58                     //若相等,保证新元素插在旧元素后面,保证稳定性
59                     left = mid + 1;
60                 
61             
62             //空出位置,等待temp插入,left位置即是待插入的位置
63             //此步骤用于空出位置
64             for (int j = i - 1; j >= left; j--) 
65                 arr[j + 1] = arr[j];
66             
67             //i==left的情况left会在right右边,此时要排序的数是最大的,left移在i的位置
68             if (i != left) 
69                 arr[left] = temp;
70             
71         
72     
73 

 

以上是关于排序算法一二分排序的主要内容,如果未能解决你的问题,请参考以下文章

Java八股文面试题 基础篇 -- 二分查找算法冒泡排序选择排序插入排序希尔排序快速排序

Java学习 数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

排序算法—— 直接插入排序二分插入排序

带你整理面试过程中常考的九大排序算法

算法之希尔排序快速排序二分查找

分治法应用之二分查找 快速排序递归排序