线性表练习之Example028-用二分查找在表中查找数值为 x 的元素,如果找到则与后继元素相交换,如果未找到则插入到顺序表中正确位置

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表练习之Example028-用二分查找在表中查找数值为 x 的元素,如果找到则与后继元素相交换,如果未找到则插入到顺序表中正确位置相关的知识,希望对你有一定的参考价值。

Example028

原文链接:Example028

题目

线性表 [a1, a2, a3, ..., an] 中的元素递增有序且按顺序存储于计算机内。要求设计一个算法,完成用最少时间在表中查找数值为 x
的元素,若找到,则将其与后继元素位置相交换,若找不到,则将其插入表中并使表中元素仍递增有序。

分析

本题考查的知识点:

  • 二分查找
  • 交换数组元素
  • 在数组中插入新元素

分析

  • 顺序存储的线性表递增有序,要求用最少的时间在表中查找数值为 x 的元素,所有要采用二分查找。
  • 所以本题的难点在于二分查找,是一个综合性比较高的题目。

图解

略。

C实现

核心代码:

/**
 * 有序顺序表
 * @param A 数组
 * @param n 数组长度
 * @param x 指定数值
 */
void binarySearch(int A[], int n, int x) 
    // 利用二分查找来找到数组中等于 x 的元素
    int low = 0;
    int high = n - 1;
    int mid = -1;
    while (low <= high) 
        mid = (low + high) / 2;
        if (A[mid] == x) 
            break;
         else if (A[mid] > x) 
            high = mid - 1;
         else 
            low = mid + 1;
        
    
    // 下面两个 if 语句只会执行一个
    // 如果找到则将其与后继元素位置相交换
    if (A[mid] == x && mid != n - 1) // 若最后一个元素与 x 相等,则不存在与其后继交换的操作
        int temp = A[mid];
        A[mid] = A[mid + 1];
        A[mid + 1] = temp;
    
    // 如果没有找到,则将其插入到顺序表指定位置
    if (low > high) 
        int i;
        // 后移元素
        for (i = n - 1; i > high; i--) 
            A[i + 1] = A[i];
        
        // 插入 x
        A[i + 1] = x;
    

完整代码:

#include <stdio.h>

/**
 * 有序顺序表
 * @param A 数组
 * @param n 数组长度
 * @param x 指定数值
 */
void binarySearch(int A[], int n, int x) 
    // 利用二分查找来找到数组中等于 x 的元素
    int low = 0;
    int high = n - 1;
    int mid = -1;
    while (low <= high) 
        mid = (low + high) / 2;
        if (A[mid] == x) 
            break;
         else if (A[mid] > x) 
            high = mid - 1;
         else 
            low = mid + 1;
        
    
    // 下面两个 if 语句只会执行一个
    // 如果找到则将其与后继元素位置相交换
    if (A[mid] == x && mid != n - 1) // 若最后一个元素与 x 相等,则不存在与其后继交换的操作
        int temp = A[mid];
        A[mid] = A[mid + 1];
        A[mid + 1] = temp;
    
    // 如果没有找到,则将其插入到顺序表指定位置
    if (low > high) 
        int i;
        // 后移元素
        for (i = n - 1; i > high; i--) 
            A[i + 1] = A[i];
        
        // 插入 x
        A[i + 1] = x;
    


/**
 * 打印数组
 * @param arr 数组
 * @param n 数组长度
 */
void print(int arr[], int n) 
    printf("[");
    for (int i = 0; i < n; i++) 
        printf("%d", arr[i]);
        if (i != n - 1) 
            printf(", ");
        
    
    printf("]\\n");


int main() 
    int A[] = 1, 2, 3, 5, 6, 7;
    int n = 6;
    print(A, n);

    // 调用函数
    int x = 4;
    binarySearch(A, n, x);
    print(A, 7);

执行结果:

[1, 2, 3, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7]

Java实现

核心代码:

    /**
 * 有序顺序表
 *
 * @param A 数组
 * @param n 数组长度
 * @param x 指定数值
 */
public static void binarySearch(int[]A,int n,int x)
        // 利用二分查找来找到数组中等于 x 的元素
        int low=0;
        int high=n-1;
        int mid=-1;
        while(low<=high)
        mid=(low+high)/2;
        if(A[mid]==x)
        break;
        else if(A[mid]>x)
        high=mid-1;
        else
        low=mid+1;
        
        
        // 下面两个 if 语句只会执行一个
        // 如果找到则将其与后继元素位置相交换
        if(A[mid]==x&&mid!=n-1)// 若最后一个元素与 x 相等,则不存在与其后继交换的操作
        int temp=A[mid];
        A[mid]=A[mid+1];
        A[mid+1]=temp;
        
        // 如果没有找到,则将其插入到顺序表指定位置
        if(low>high)
        int i;
        // 后移元素
        for(i=n-1;i>high;i--)
        A[i+1]=A[i];
        
        // 插入 x
        A[i+1]=x;
        
        

完整代码:

public class Test 
    public static void main(String[] args) throws Exception 
        int[] A = new int[]1, 2, 3, 4, 5, 6, 7;
        int n = 7;
        System.out.println(Arrays.toString(A));

        // 调用函数
        int x = 4;
        binarySearch(A, n, x);
        System.out.println(Arrays.toString(A));
    

    /**
     * 有序顺序表
     *
     * @param A 数组
     * @param n 数组长度
     * @param x 指定数值
     */
    public static void binarySearch(int[] A, int n, int x) 
        // 利用二分查找来找到数组中等于 x 的元素
        int low = 0;
        int high = n - 1;
        int mid = -1;
        while (low <= high) 
            mid = (low + high) / 2;
            if (A[mid] == x) 
                break;
             else if (A[mid] > x) 
                high = mid - 1;
             else 
                low = mid + 1;
            
        
        // 下面两个 if 语句只会执行一个
        // 如果找到则将其与后继元素位置相交换
        if (A[mid] == x && mid != n - 1) // 若最后一个元素与 x 相等,则不存在与其后继交换的操作
            int temp = A[mid];
            A[mid] = A[mid + 1];
            A[mid + 1] = temp;
        
        // 如果没有找到,则将其插入到顺序表指定位置
        if (low > high) 
            int i;
            // 后移元素
            for (i = n - 1; i > high; i--) 
                A[i + 1] = A[i];
            
            // 插入 x
            A[i + 1] = x;
        
    

执行结果:

[1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 5, 4, 6, 7]

以上是关于线性表练习之Example028-用二分查找在表中查找数值为 x 的元素,如果找到则与后继元素相交换,如果未找到则插入到顺序表中正确位置的主要内容,如果未能解决你的问题,请参考以下文章

线性表练习之Example021-删除顺序表中的最后一个元素

线性表练习之Example004-将顺序表中所有元素逆置

线性表练习之Example039-删除循环单链表中的所有最小值节点直至链表为空

线性表练习之Example003-删除单链表最小值节点

线性表练习之Example011-分解链表中的奇数节点和偶数节点

线性表练习之Example002-删除递增非空单链表中的重复值域节点