二进制插入排序

我们可以使用二进制搜索来减少 正常插入排序 .二进制插入排序使用二进制搜索来查找在每次迭代中插入选定项的正确位置。 在正常插入排序中,最坏情况下需要进行O(n)比较(在第n次迭代中)。我们可以使用 二进制搜索 .

null

C++

// C program for implementation of
// binary insertion sort
#include <iostream>
using namespace std;
// A binary search based function
// to find the position
// where item should be inserted
// in a[low..high]
int binarySearch( int a[], int item,
int low, int high)
{
if (high <= low)
return (item > a[low]) ?
(low + 1) : low;
int mid = (low + high) / 2;
if (item == a[mid])
return mid + 1;
if (item > a[mid])
return binarySearch(a, item,
mid + 1, high);
return binarySearch(a, item, low,
mid - 1);
}
// Function to sort an array a[] of size 'n'
void insertionSort( int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1; i < n; ++i)
{
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
int main()
{
int a[]
= { 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 };
int n = sizeof (a) / sizeof (a[0]), i;
insertionSort(a, n);
cout << "Sorted array: " ;
for (i = 0; i < n; i++)
cout << " " << a[i];
return 0;
}
// this code is contribution by shivanisinghss2110


C

// C program for implementation of
// binary insertion sort
#include <stdio.h>
// A binary search based function
// to find the position
// where item should be inserted
// in a[low..high]
int binarySearch( int a[], int item,
int low, int high)
{
if (high <= low)
return (item > a[low]) ?
(low + 1) : low;
int mid = (low + high) / 2;
if (item == a[mid])
return mid + 1;
if (item > a[mid])
return binarySearch(a, item,
mid + 1, high);
return binarySearch(a, item, low,
mid - 1);
}
// Function to sort an array a[] of size 'n'
void insertionSort( int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1; i < n; ++i)
{
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
int main()
{
int a[]
= { 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 };
int n = sizeof (a) / sizeof (a[0]), i;
insertionSort(a, n);
printf ( "Sorted array: " );
for (i = 0; i < n; i++)
printf ( "%d " , a[i]);
return 0;
}


JAVA

// Java Program implementing
// binary insertion sort
import java.util.Arrays;
class GFG
{
public static void main(String[] args)
{
final int [] arr = { 37 , 23 , 0 , 17 , 12 , 72 ,
31 , 46 , 100 , 88 , 54 };
new GFG().sort(arr);
for ( int i = 0 ; i < arr.length; i++)
System.out.print(arr[i] + " " );
}
// Driver Code
public void sort( int array[])
{
for ( int i = 1 ; i < array.length; i++)
{
int x = array[i];
// Find location to insert
// using binary search
int j = Math.abs(
Arrays.binarySearch(array, 0 ,
i, x) + 1 );
// Shifting array to one
// location right
System.arraycopy(array, j,
array, j + 1 , i - j);
// Placing element at its
// correct location
array[j] = x;
}
}
}
// Code contributed by Mohit Gupta_OMG


Python3

# Python Program implementation
# of binary insertion sort
def binary_search(arr, val, start, end):
# we need to distinugish whether we
# should insert before or after the
# left boundary. imagine [0] is the last
# step of the binary search and we need
# to decide where to insert -1
if start = = end:
if arr[start] > val:
return start
else :
return start + 1
# this occurs if we are moving
# beyond left's boundary meaning
# the left boundary is the least
# position to find a number greater than val
if start > end:
return start
mid = (start + end) / / 2
if arr[mid] < val:
return binary_search(arr, val, mid + 1 , end)
elif arr[mid] > val:
return binary_search(arr, val, start, mid - 1 )
else :
return mid
def insertion_sort(arr):
for i in range ( 1 , len (arr)):
val = arr[i]
j = binary_search(arr, val, 0 , i - 1 )
arr = arr[:j] + [val] + arr[j:i] + arr[i + 1 :]
return arr
print ( "Sorted array:" )
print (insertion_sort([ 37 , 23 , 0 , 31 , 22 , 17 , 12 , 72 , 31 , 46 , 100 , 88 , 54 ]))
# Code contributed by Mohit Gupta_OMG


C#

// C# Program implementing
// binary insertion sort
using System;
class GFG {
public static void Main()
{
int [] arr = { 37, 23, 0,   17, 12, 72,
31, 46, 100, 88, 54 };
sort(arr);
for ( int i = 0; i < arr.Length; i++)
Console.Write(arr[i] + " " );
}
// Driver Code
public static void sort( int [] array)
{
for ( int i = 1; i < array.Length; i++)
{
int x = array[i];
// Find location to insert using
// binary search
int j = Math.Abs(
Array.BinarySearch(array,
0, i, x) + 1);
// Shifting array to one location right
System.Array.Copy(array, j,
array, j + 1,
i - j);
// Placing element at its correct
// location
array[j] = x;
}
}
}
// This code is contributed by nitin mittal.


PHP

<?php
// PHP program for implementation of
// binary insertion sort
// A binary search based function to find
// the position where item should be
// inserted in a[low..high]
function binarySearch( $a , $item , $low , $high )
{
if ( $high <= $low )
return ( $item > $a [ $low ]) ?
( $low + 1) : $low ;
$mid = (int)(( $low + $high ) / 2);
if ( $item == $a [ $mid ])
return $mid + 1;
if ( $item > $a [ $mid ])
return binarySearch( $a , $item ,
$mid + 1, $high );
return binarySearch( $a , $item , $low ,
$mid - 1);
}
// Function to sort an array a of size 'n'
function insertionSort(& $a , $n )
{
$i ; $loc ; $j ; $k ; $selected ;
for ( $i = 1; $i < $n ; ++ $i )
{
$j = $i - 1;
$selected = $a [ $i ];
// find location where selected
// item should be inserted
$loc = binarySearch( $a , $selected , 0, $j );
// Move all elements after location
// to create space
while ( $j >= $loc )
{
$a [ $j + 1] = $a [ $j ];
$j --;
}
$a [ $j + 1] = $selected ;
}
}
// Driver Code
$a = array (37, 23, 0, 17, 12, 72,
31, 46, 100, 88, 54);
$n = sizeof( $a );
insertionSort( $a , $n );
echo "Sorted array:" ;
for ( $i = 0; $i < $n ; $i ++)
echo "$a[$i] " ;
// This code is contributed by
// Adesh Singh
?>


Javascript

<script>
// Javascript Program implementing
// binary insertion sort
function binarySearch(a, item, low, high)
{
if (high <= low)
return (item > a[low]) ?
(low + 1) : low;
mid = Math.floor((low + high) / 2);
if (item == a[mid])
return mid + 1;
if (item > a[mid])
return binarySearch(a, item,
mid + 1, high);
return binarySearch(a, item, low,
mid - 1);
}
function sort(array)
{
for (let i = 1; i < array.length; i++)
{
let j = i - 1;
let x = array[i];
// Find location to insert
// using binary search
let loc = Math.abs(
binarySearch(array, x,
0, j));
// Shifting array to one
// location right
while (j >= loc)
{
array[j + 1] = array[j];
j--;
}
// Placing element at its
// correct location
array[j+1] = x;
}
}
// Driver Code
let arr=[ 37, 23, 0,   17, 12, 72,
31, 46, 100, 88, 54];
sort(arr);
for (let i = 0; i < arr.length; i++)
document.write(arr[i] + " " );
// This code is contributed by unknown2108
</script>
// C program for implementation of
// binary insertion sort
#include <stdio.h>
// A binary search based function
// to find the position
// where item should be inserted
// in a[low..high]
int binarySearch(int a[], int item,
int low, int high)
{
if (high <= low)
return (item > a[low]) ?
(low + 1) : low;
int mid = (low + high) / 2;
if (item == a[mid])
return mid + 1;
if (item > a[mid])
return binarySearch(a, item,
mid + 1, high);
return binarySearch(a, item, low,
mid - 1);
}
// Function to sort an array a[] of size 'n'
void insertionSort(int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1; i < n; ++i)
{
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
int main()
{
int a[]
= { 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 };
int n = sizeof(a) / sizeof(a[0]), i;
insertionSort(a, n);
printf( "Sorted array: " );
for (i = 0; i < n; i++)
printf( "%d " , a[i]);
r // C program for implementation of
// binary insertion sort
#include <stdio.h>
// A binary search based function
// to find the position
// where item should be inserted
// in a[low..high]
int binarySearch(int a[], int item,
int low, int high)
{
if (high <= low)
return (item > a[low]) ?
(low + 1) : low;
int mid = (low + high) / 2;
if (item == a[mid])
return mid + 1;
if (item > a[mid])
return binarySearch(a, item,
mid + 1, high);
return binarySearch(a, item, low,
mid - 1);
}
// Function to sort an array a[] of size 'n'
void insertionSort(int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1; i < n; ++i)
{
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
int main()
{
int a[]
= { 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 };
int n = sizeof(a) / sizeof(a[0]), i;
insertionSort(a, n);
printf( "Sorted array: " );
for (i = 0; i < n; i++)
printf( "%d " , a[i]);
// C program for implementation of
// binary insertion sort
#include <stdio.h>
// A binary search based function
// to find the position
// where item should be inserted
// in a[low..high]
int binarySearch(int a[], int item,
int low, int high)
{
if (high <= low)
return (item > a[low]) ?
(low + 1) : low;
int mid = (low + high) / 2;
if (item == a[mid])
return mid + 1;
if (item > a[mid])
return binarySearch(a, item,
mid + 1, high);
return binarySearch(a, item, low,
mid - 1);
}
// Function to sort an array a[] of size 'n'
void insertionSort(int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1; i < n; ++i)
{
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
int main()
{
int a[]
= { 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 };
int n = sizeof(a) / sizeof(a[0]), i;
insertionSort(a, n);
printf( "Sorted array: " );
for (i = 0; i < n; i++)
printf( "%d " , a[i]);
// C program for implementation of
// binary insertion sort
#include <stdio.h>
// A binary search based function
// to find the position
// where item should be inserted
// in a[low..high]
int binarySearch(int a[], int item,
int low, int high)
{
if (high <= low)
return (item > a[low]) ?
(low + 1) : low;
int mid = (low + high) / 2;
if (item == a[mid])
return mid + 1;
if (item > a[mid])
return binarySearch(a, item,
mid + 1, high);
return binarySearch(a, item, low,
mid - 1);
}
// Function to sort an array a[] of size 'n'
void insertionSort(int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1; i < n; ++i)
{
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
int main()
{
int a[]
= { 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 };
int n = sizeof(a) / sizeof(a[0]), i;
insertionSort(a, n);
printf( "Sorted array: " );
for (i = 0; i < n; i++)
printf( "%d " , a[i]);
// C program for implementation of
// binary insertion sort
#include <stdio.h>
// A binary search based function
// to find the position
// where item should be inserted
// in a[low..high]
int binarySearch(int a[], int item,
int low, int high)
{
if (high <= low)
return (item > a[low]) ?
(low + 1) : low;
int mid = (low + high) / 2;
if (item == a[mid])
return mid + 1;
if (item > a[mid])
return binarySearch(a, item,
mid + 1, high);
return binarySearch(a, item, low,
mid - 1);
}
// Function to sort an array a[] of size 'n'
void insertionSort(int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1; i < n; ++i)
{
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
int main()
{
int a[]
= { 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 };
int n = sizeof(a) / sizeof(a[0]), i;
insertionSort(a, n);
printf( "Sorted array: " );
for (i = 0; i < n; i++)
printf( "%d " , a[i]); // C program for implementation of
// binary insertion sort
#include <stdio.h>
// A binary search based function
// to find the position
// where item should be inserted
// in a[low..high]
int binarySearch(int a[], int item,
int low, int high)
{
if (high <= low)
return (item > a[low]) ?
(low + 1) : low;
int mid = (low + high) / 2;
if (item == a[mid])
return mid + 1;
if (item > a[mid])
return binarySearch(a, item,
mid + 1, high);
return binarySearch(a, item, low,
mid - 1);
}
// Function to sort an array a[] of size 'n'
void insertionSort(int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1; i < n; ++i)
{
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc)
{
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
int main()
{
int a[]
= { 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 };
int n = sizeof(a) / sizeof(a[0]), i;
insertionSort(a, n);
printf( "Sorted array: " );
for (i = 0; i < n; i++)
printf( "%d " , a[i])


输出

Sorted array: 0 12 17 23 31 37 46 54 72 88 100 

时间复杂性: 整个算法的运行最坏情况下的运行时间仍然是O(n 2. )因为每次插入都需要一系列交换。

另一种方法:下面是上述递归代码的迭代实现

C++

#include <iostream>
using namespace std;
// iterative implementation
int binarySearch( int a[], int item, int low, int high)
{
while (low <= high) {
int mid = low + (high - low) / 2;
if (item == a[mid])
return mid + 1;
else if (item > a[mid])
low = mid + 1;
else
high = mid - 1;
}
return low;
}
// Function to sort an array a[] of size 'n'
void insertionSort( int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1; i < n; ++i) {
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
int main()
{
int a[]
= { 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 };
int n = sizeof (a) / sizeof (a[0]), i;
insertionSort(a, n);
cout << "Sorted array: " ;
for (i = 0; i < n; i++)
cout << " " << a[i];
return 0;
}
// This code is contributed by shivanisinghss2110.


C

#include <stdio.h>
// iterative implementation
int binarySearch( int a[], int item, int low, int high)
{
while (low <= high) {
int mid = low + (high - low) / 2;
if (item == a[mid])
return mid + 1;
else if (item > a[mid])
low = mid + 1;
else
high = mid - 1;
}
return low;
}
// Function to sort an array a[] of size 'n'
void insertionSort( int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1; i < n; ++i) {
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
int main()
{
int a[]
= { 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 };
int n = sizeof (a) / sizeof (a[0]), i;
insertionSort(a, n);
printf ( "Sorted array: " );
for (i = 0; i < n; i++)
printf ( "%d " , a[i]);
return 0;
}
// contributed by tmeid


JAVA

import java.io.*;
class GFG {
// iterative implementation
static int binarySearch( int a[], int item, int low, int high)
{
while (low <= high) {
int mid = low + (high - low) / 2 ;
if (item == a[mid])
return mid + 1 ;
else if (item > a[mid])
low = mid + 1 ;
else
high = mid - 1 ;
}
return low;
}
// Function to sort an array a[] of size 'n'
static void insertionSort( int a[], int n)
{
int i, loc, j, k, selected;
for (i = 1 ; i < n; ++i) {
j = i - 1 ;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0 , j);
// Move all elements after location to create space
while (j >= loc) {
a[j + 1 ] = a[j];
j--;
}
a[j + 1 ] = selected;
}
}
// Driver Code
public static void main (String[] args)
{
int a[]
= { 37 , 23 , 0 , 17 , 12 , 72 , 31 , 46 , 100 , 88 , 54 };
int n = a.length, i;
insertionSort(a, n);
System.out.println( "Sorted array:" );
for (i = 0 ; i < n; i++)
System.out.print(a[i] + " " );
}
}
// This code is contributed by shivanisinghss2110.


Python3

# iterative implementation
def binarySearch(a, item, low, high):
while (low < = high):
mid = low + (high - low) / / 2
if (item = = a[mid]):
return mid + 1
elif (item > a[mid]):
low = mid + 1
else :
high = mid - 1
return low
# Function to sort an array a[] of size 'n'
def insertionSort(a, n):
for i in range (n):
j = i - 1
selected = a[i]
# find location where selected should be inseretd
loc = binarySearch(a, selected, 0 , j)
# Move all elements after location to create space
while (j > = loc):
a[j + 1 ] = a[j]
j - = 1
a[j + 1 ] = selected
# Driver Code
a = [ 37 , 23 , 0 , 17 , 12 , 72 , 31 , 46 , 100 , 88 , 54 ]
n = len (a)
insertionSort(a, n)
print ( "Sorted array: " )
for i in range (n):
print (a[i], end = " " )
# This code is contributed by shivanisinghss2110


C#

using System;
class GFG {
// iterative implementation
static int binarySearch( int []a, int item, int low, int high)
{
while (low <= high) {
int mid = low + (high - low) / 2;
if (item == a[mid])
return mid + 1;
else if (item > a[mid])
low = mid + 1;
else
high = mid - 1;
}
return low;
}
// Function to sort an array a[] of size 'n'
static void insertionSort( int []a, int n)
{
int i, loc, j, selected;
for (i = 1; i < n; ++i) {
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
public static void Main (String[] args)
{
int []a = { 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 };
int n = a.Length, i;
insertionSort(a, n);
Console.WriteLine( "Sorted array:" );
for (i = 0; i < n; i++)
Console.Write(a[i] + " " );
}
}
// This code is contributed by shivanisinghss2110


Javascript

<script>
// iterative implementation
function binarySearch( a,  item,  low,  high)
{
while (low <= high) {
var mid = low + (high - low) / 2;
if (item == a[mid])
return mid + 1;
else if (item > a[mid])
low = mid + 1;
else
high = mid - 1;
}
return low;
}
// Function to sort an array a[] of size 'n'
function insertionSort(a, n)
{
var i, loc, j, k, selected;
for (i = 1; i < n; ++i) {
j = i - 1;
selected = a[i];
// find location where selected should be inseretd
loc = binarySearch(a, selected, 0, j);
// Move all elements after location to create space
while (j >= loc) {
a[j + 1] = a[j];
j--;
}
a[j + 1] = selected;
}
}
// Driver Code
var a = [ 37, 23, 0, 17, 12, 72, 31, 46, 100, 88, 54 ];
var n = a.length, i;
insertionSort(a, n);
document.write( "Sorted array:" + "<br>" );
for (i = 0; i < n; i++)
document.write(a[i] + " " );
// This code is contributed by shivanisinghss2110
</script>


输出

Sorted array: 0 12 17 23 31 37 46 54 72 88 100 

本文由 阿米特·奥迪 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享