在一个已排序的数组里如何插入新数据项?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在一个已排序的数组里如何插入新数据项?相关的知识,希望对你有一定的参考价值。

在一个已经排序的数组里,在合适的位置增加一个数据项,其他元素按顺序往后排。
如何写?语言:java.

#include<stdio.h>

int main()

int n=9;//数组元素个数
int a[10]=;

//开始两分查找
int i,j,mid,insert=5;
i=0; j=n-1;
while(i<=j)
mid=(i+j)/2;
if(a[mid]>insert)
j=mid-1;
else if(a[mid]<insert)
i=mid+1;
else//a[mid]==inset,数据重复
return 0;

//两分查找结束
//此时a[j]<insert<a[i],i-j=1

//把元素a[i...n-1]往后移
for(j=n;j>=i;j--)
a[j]=a[j-1];
//插入insert
a[i]=insert;
//调整元素个数
n++;

//输出
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;


其它补充:
(1)因为这是数组,数组插入元素时必须移动从插入位置往后所有的元素,所以用两分法一点也不高效。想高效地用两分法插入应该使用二叉树。
(2)高效地往已排序的数组中插入元素应该直接从后往前一边比较一边移边。
(3)程序中的两分查找非常有用,如果不会,一定要掌握。尤其要了解当跳出while循环时i,j值的含义,这样才能应对各种使用上的变化。
(4)本程序中,如果把insert改成-1或10,同样可以运行。
参考技术A 标准做法是使用适合插入的数据结构,比如链表或者二叉树,这样插入的效率最高。Java Collection有LinkedList链表类。如果java没有内置这些工具,比如树,就要自己先实现。
如果强行在普通[]数组中插入是很少见,算比较不地道的做法:
用复制的办法,复制前段数据,复制插入项,再复制后段数据。

以上是关于在一个已排序的数组里如何插入新数据项?的主要内容,如果未能解决你的问题,请参考以下文章

五十五深入插入排序和选择排序

排序算法:直接插入排序

插入排序

BasicSort — InsertionSort

超级简单的插入排序

排序算法-插入排序(insertion sort)