📜  使用二进制搜索创建排序的数组

📅  最后修改于: 2021-04-29 14:26:44             🧑  作者: Mango

给定一个数组,任务是从给定数组的元素按升序创建一个新的排序数组。
例子:

Input : arr[] = {2, 5, 4, 9, 8}
Output : 2 4 5 8 9

Input : arr[] = {10, 45, 98, 35, 45}
Output : 10 35 45 45 98

使用二进制搜索可以有效地解决上述问题。我们创建一个新数组,如果第一个元素为空,则将其插入。现在,对于每个新元素,我们都使用二进制搜索在新数组中找到该元素的正确位置,然后将该元素插入到新数组中的相应索引处。
下面是上述方法的实现:

C++
// C++ program to create a sorted array
// using Binary Search
 
#include 
using namespace std;
 
// Function to create a new sorted array
// using Binary Search
void createSorted(int a[], int n)
{
    // Auxiliary Array
    vector b;
 
    for (int j = 0; j < n; j++) {
        // if b is empty any element can be at
        // first place
        if (b.empty())
            b.push_back(a[j]);
        else {
 
            // Perform Binary Search to find the correct
            // position of current element in the
            // new array
            int start = 0, end = b.size() - 1;
 
            // let the element should be at first index
            int pos = 0;
 
            while (start <= end) {
 
                int mid = start + (end - start) / 2;
 
                // if a[j] is already present in the new array
                if (b[mid] == a[j]) {
                    // add a[j] at mid+1. you can add it at mid
                    b.emplace(b.begin() + max(0, mid + 1), a[j]);
                    break;
                }
                // if a[j] is lesser than b[mid] go right side
                else if (b[mid] > a[j])
                    // means pos should be between start and mid-1
                    pos = end = mid - 1;
                else
                    // else pos should be between mid+1 and end
                    pos = start = mid + 1;
 
                // if a[j] is the largest push it at last
                if (start > end) {
                    pos = start;
                    b.emplace(b.begin() + max(0, pos), a[j]);
 
                    // here max(0, pos) is used because sometimes
                    // pos can be negative as smallest duplicates
                    // can be present in the array
                    break;
                }
            }
        }
    }
 
    // Print the new generated sorted array
    for (int i = 0; i < n; i++)
        cout << b[i] << " ";
}
 
// Driver Code
int main()
{
    int a[] = { 2, 5, 4, 9, 8 };
    int n = sizeof(a) / sizeof(a[0]);
 
    createSorted(a, n);
 
    return 0;
}


Java
// Java program to create a sorted array
// using Binary Search
import java.util.*;
 
class GFG
{
 
// Function to create a new sorted array
// using Binary Search
static void createSorted(int a[], int n)
{
    // Auxiliary Array
    Vector b = new Vector<>();
 
    for (int j = 0; j < n; j++)
    {
        // if b is empty any element can be at
        // first place
        if (b.isEmpty())
            b.add(a[j]);
        else
        {
 
            // Perform Binary Search to find the correct
            // position of current element in the
            // new array
            int start = 0, end = b.size() - 1;
 
            // let the element should be at first index
            int pos = 0;
 
            while (start <= end)
            {
 
                int mid = start + (end - start) / 2;
 
                // if a[j] is already present in the new array
                if (b.get(mid) == a[j])
                {
                    // add a[j] at mid+1. you can add it at mid
                    b.add((Math.max(0, mid + 1)), a[j]);
                    break;
                }
                 
                // if a[j] is lesser than b[mid] go right side
                else if (b.get(mid) > a[j])
                    // means pos should be between start and mid-1
                    pos = end = mid - 1;
                else
                    // else pos should be between mid+1 and end
                    pos = start = mid + 1;
 
                // if a[j] is the largest push it at last
                if (start > end)
                {
                    pos = start;
                    b.add(Math.max(0, pos), a[j]);
 
                    // here max(0, pos) is used because sometimes
                    // pos can be negative as smallest duplicates
                    // can be present in the array
                    break;
                }
            }
        }
    }
 
    // Print the new generated sorted array
    for (int i = 0; i < n; i++)
        System.out.print(b.get(i) + " ");
}
 
// Driver Code
public static void main(String args[])
{
    int a[] = { 2, 5, 4, 9, 8 };
    int n = a.length;
 
    createSorted(a, n);
}
}
 
/* This code is contributed by PrinciRaj1992 */


Python3
# Python program to create a sorted array
# using Binary Search
 
# Function to create a new sorted array
# using Binary Search
def createSorted(a: list, n: int):
 
    # Auxiliary Array
    b = []
    for j in range(n):
 
        # if b is empty any element can be at
        # first place
        if len(b) == 0:
            b.append(a[j])
        else:
 
            # Perform Binary Search to find the correct
            # position of current element in the
            # new array
            start = 0
            end = len(b) - 1
 
            # let the element should be at first index
            pos = 0
            while start <= end:
                mid = start + (end - start) // 2
 
                # if a[j] is already present in the new array
                if b[mid] == a[j]:
 
                    # add a[j] at mid+1. you can add it at mid
                    b.insert(max(0, mid + 1), a[j])
                    break
 
                # if a[j] is lesser than b[mid] go right side
                elif b[mid] > a[j]:
 
                    # means pos should be between start and mid-1
                    pos = end = mid - 1
                else:
 
                    # else pos should be between mid+1 and end
                    pos = start = mid + 1
 
                # if a[j] is the largest push it at last
                if start > end:
                    pos = start
                    b.insert(max(0, pos), a[j])
 
                    # here max(0, pos) is used because sometimes
                    # pos can be negative as smallest duplicates
                    # can be present in the array
                    break
 
    # Print the new generated sorted array
    for i in range(n):
        print(b[i], end=" ")
 
# Driver Code
if __name__ == "__main__":
 
    a = [2, 5, 4, 9, 8]
    n = len(a)
    createSorted(a, n)
 
# This code is contributed by
# sanjeev2552


C#
// C# program to create a sorted array
// using Binary Search
using System;
using System.Collections.Generic;
     
class GFG
{
 
// Function to create a new sorted array
// using Binary Search
static void createSorted(int []a, int n)
{
    // Auxiliary Array
    List b = new List();
 
    for (int j = 0; j < n; j++)
    {
        // if b is empty any element can be at
        // first place
        if (b.Count == 0)
            b.Add(a[j]);
        else
        {
 
            // Perform Binary Search to find the correct
            // position of current element in the
            // new array
            int start = 0, end = b.Count - 1;
 
            // let the element should be at first index
            int pos = 0;
 
            while (start <= end)
            {
 
                int mid = start + (end - start) / 2;
 
                // if a[j] is already present in the new array
                if (b[mid] == a[j])
                {
                    // add a[j] at mid+1. you can add it at mid
                    b.Insert((Math.Max(0, mid + 1)), a[j]);
                    break;
                }
                 
                // if a[j] is lesser than b[mid] go right side
                else if (b[mid] > a[j])
                 
                    // means pos should be between start and mid-1
                    pos = end = mid - 1;
                else
                 
                    // else pos should be between mid+1 and end
                    pos = start = mid + 1;
 
                // if a[j] is the largest push it at last
                if (start > end)
                {
                    pos = start;
                    b.Insert(Math.Max(0, pos), a[j]);
 
                    // here Max(0, pos) is used because sometimes
                    // pos can be negative as smallest duplicates
                    // can be present in the array
                    break;
                }
            }
        }
    }
 
    // Print the new generated sorted array
    for (int i = 0; i < n; i++)
        Console.Write(b[i] + " ");
}
 
// Driver Code
public static void Main(String []args)
{
    int []a = { 2, 5, 4, 9, 8 };
    int n = a.Length;
 
    createSorted(a, n);
}
}
 
// This code is contributed by 29AjayKumar


输出:
2 4 5 8 9

时间复杂度:O(N * N)。尽管正在使用二进制搜索,但是列表插入调用平均在O(N)时间内运行
辅助空间:O(N)