PHP 插入排序 -- 折半查找

1. 折半查找  -- Binary Insertion Sort

时间复杂度 : O(n^2)

适用条件 : 相对直接插入排序,减少了数值的比较次数。适用于需要排序的数码比较少的情况。

 1 <?php
 2 namespace Test;
 3
 4 $a = [0 =>3,4,5,1,11,9,27,27,18,20];
 5
 6 function binaryInsertSort(array &$arr)
 7 {
 8     $guild = 0;  // 监视哨
 9     $arr = array_values($arr);
10     array_unshift($arr,$guild);
11     $len = count($arr);
12
13     for($i = 2;$i < $len;$i++)
14     {
15         if($arr[$i-1] > $arr[$i])
16         {
17             $arr[0] = $arr[$i];
18             $low = 1;
19             $high = $i - 1;
20
21             while($low <= $high)
22             {
23                 $mid = ($high + $low)/2;
24                 if($arr[$mid] > $arr[0])
25                 {
26                     $high = $mid - 1;
27                 }
28                 else
29                 {
30                     $low = $mid + 1;
31                 }
32             }
33
34             for($j = $i;$j >= $high + 1; --$j)
35             {
36                 $arr[$j] = $arr[$j - 1];
37             }
38
39             $arr[$high + 1] = $arr[0];
40         }
41     }
42     array_shift($arr);
43 }
44
45 binaryInsertSort($a);
46 echo implode(‘,‘,$a);

输出:

时间: 2024-08-08 01:16:13

PHP 插入排序 -- 折半查找的相关文章

查找总结(一)-----简单查找和折半查找

先介绍一个概念,平均查找长度(ASL)为每一个关键字出现的概率*查找该关键所进行比较的次数,所有关键字这样的值之和 一.简单查找 简单查找,也就是一个个地比较了,不多说 int Easy_find(char c[],int n,char key) { int i=0; while (i<n&&c[i]!=key) { i++; } if (i<n) { return i; } else { return NO_FIND; } } 时间复杂度分析:while循环最少比较1次,最多

数据结构之插入排序--折半插入排序

排序思路:通过折半查找的方式找到合适的插入位置再插入. 算法实现: public class BiInsertSort { public static void biInsertSort(int arr[]){ for(int i = 1; i < arr.length; i ++){ int temp = arr[i]; int left = 0; int right = i-1; while(left <= right){//通过拆装查找找到插入位置 int mid = (left+rig

内部排序-&gt;插入排序-&gt;其它插入排序-&gt;折半插入排序

文字描述 和直接插入排序比较,只是把"查找"操作利用"折半查找"来实现,由此进行的插入排序叫做折半插入排序. 示意图 略 算法分析 和直接插入排序比,减少了比较次数,但是移动次数没有变,所以折半插入排序算法的时间复杂度仍然是n*n, 辅助空间为1,是稳定的排序方法. 代码实现 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define EQ(a, b) ((a) == (b)) 5 #defi

查找之二折半查找(二分法查找)和插值查找

一.折半查找的前提是线性表中的记录必须好似关键码有序,线性表必须是顺序存储的. 二.折半查找 1 public class Binary_SearchDemo01 { 2 static int[] num = {0,1,3,5}; 3 public static void main(String[] args) { 4 int key = 3; 5 int x = Sequential_Search(key); 6 System.out.println(num[x]); 7 } 8 privat

查找之折半查找

1 #include<stdio.h> 2 #define N 10 3 4 void QuickSort(int a[],int left, int right); 5 int BinSearch(int a[], int low, int high, int key); 6 int main() 7 { 8 int a[N] = {2,8,4,9,7,6,5,3,1,0}; 9 int j = 0, i; 10 QuickSort(a, 0, sizeof(a)/sizeof(a[0])-

选择排序和冒泡排序以及折半查找

1.选择排序 2.冒泡排序 3.折半查找 方式一:开发使用的方法 方式二:普通的折半

【分治】折半查找法

问题 K: [分治]折半查找法 时间限制: 1 Sec  内存限制: 128 MB提交: 17  解决: 9[提交][状态][讨论版] 题目描述 大魔导师培根曾经说过:“读书使人明智,读诗使人聪慧,演算使人精密,哲理使人深刻,伦理学使人有修养,逻辑修辞使人善辩.”由此可见书籍的重要性是不言而喻的.而与书籍天天打交道的图书管理员,更是夺天地之造化,吸日月之精华的“神之职业”.据史料记载,魔法世界从古至今诞生的众多不平凡的人物中,有不少人都曾经做过“图书管理员”,如道家学派创始人老子,威软公司创始人

12月28 数组的几种应用(冒泡、折半查找)

*************数组的应用************* 一.冒泡排序(升序.降序) 1.双层循环(循环套循环) (1).冒泡排序是用双层循环解决.外层循环的是趟数,里层循环的是次数.(2).趟数=n-1:次数=n-趟数.(3).里层循环使用if比较相临的两个数的大小,进行数值交换. 二.折半查找(也叫二分法) 1.前提:数组必须有序. 2.主要就是3个未知量. 顶部:topsub 底部:bottomsub 中间:midsub =(topsub+bottomsub)/2 将数组一分为二,然

java之折半查找

//功能:二分查找import java.util.*; public class Demo1 {    public static void main(String[] args) {      int arr[]={2,5,7,12,25};//定义arr数组并赋值      System.out.print("请输入你需要查找的数:");      Scanner sr=new Scanner(System.in);      int a=sr.nextInt();      B