数组的插入排序

moffatte 2004-08-30 11:25:41
这里的 insert 函数作用是:输入一个数,插入到一个有序的数组中。
但是,却出现了死循环。不知应该怎样修改。另外,我在修改时经常出现覆盖的现象,怎样避免呢?以下是代码:

以下是程序代码:

void insert(float a[], int& n, float x){
for(int i = n - 1; i > 0; i--)
if(a[i] > x)
for(int j = (n - 1); j >= i; j--) a[j] = a[j - 1];
a[i] = x;
++n;
}
另外,我参考了答案,它很简短。我想用 for 语句来写,可是不成功。请指点。
void insert(float a[], int& n, float x){
int i = n;
while(i > 0 && a[i - 1] > x)
a[i--] = a[i - 1];
a[i] = x;
++n;
}


...全文
281 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
玄豹 2004-09-07
  • 打赏
  • 举报
回复
不错,楼上的兄弟说得对,我是没有考虑到最小值插入!谢谢指正!!
moffatte 2004-09-07
  • 打赏
  • 举报
回复
没事,互相学习!
moffatte 2004-08-31
  • 打赏
  • 举报
回复
你的那个函数我也调试过了,不过没成功。可能和我的数组元素的排列顺序不同,我是从小到大排列的。有问题的话,尽管说。
这个是我经过调试后的程序:
# include<iostream.h>

void insert(float a[], int& n, float x);
void print(float a[], int m);
int main(){
float a[10] = {1, 2, 3, 4, 5, 6};
int size = 6;
float x = 0.0;

cout <<"Enter a integer: ";
cin >>x;

print(a, size);
insert(a, size, x);
print(a, size);

return (0);
}

void insert(float a[], int& n, float x){
for(int i = n - 1; i >= 0;){
if(x == 0){
for(int j = n; j >= 0; j--)
a[j] = a[j - 1];
a[j + 1] = x;        
break;           
}
else if(a[i] > x)
i--;
else{
for(int j = n; j > i + 1; j--)
a[j] = a[j - 1]; a[j] = x; break;
}
}
++n;
}
/*void insert(float a[], int& n, float x){
int i = n;
while(i > 0 && a[i - 1] > x)
a[i--] = a[i - 1];
a[i] = x;
++n;
}*/


void print(float a[], int m){
cout <<"The array is: \n";
for(int i = 0; i < m; i++)
cout <<a[i] <<" ";
cout <<endl;
}
jp1984 2004-08-30
  • 打赏
  • 举报
回复
//binary insertion sort ,using binary search to opmalize the algorithm
template<typename T>
void binaryInsert(T array[],int i)
{
int left=0,right=i-1,k;
int temp=array[i];
//binary search
while(left<=right)
{
int middle=(left+right)/2;
if(temp<array[middle])
right=middle-1;
else
left=middle+1;
}
for(k=i-1;k>=left;k--)
array[k+1]=array[k];//move forward
array[left]=temp;
}
template<typename T>
void binaryInsertSort(T array[],int array_size)
{
int i;
for(i=1;i<array_size;i++)
binaryInsert(array,i);}
jp1984 2004-08-30
  • 打赏
  • 举报
回复
//straight insertion sort
template<typename T>
void insertSort(T array[],int array_size)
{
int i,j,temp;
for(i=1;i<array_size;i++)
{
temp=array[i];
j=i-1;
while(j>=0&&array[j]>temp)
{
array[j+1]=array[j];
j--;
}
array[j+1]=temp;
}
}
积木 2004-08-30
  • 打赏
  • 举报
回复
你的问题主要在于缺少一个break,剩下的你看看这个程序就差不多了

#include<stdio.h>
void insert(float a[], int& n, float x)
{
for(int i = n - 1; i > 0; i--)
{
if(a[i] > x)
{
for(int j = n; j >i; j--)
{
a[j] = a[j - 1];
}
a[i+1] = x;
break;
}
}
++n;
}
int main()
{
float a[6]={5.0,4.0,3.0,2.0,1.0,0.0};
int n=5;
insert(a,n,2.0);
for(int i=0;i<6;i++)
{
printf("%f\t",a[i]);
}
}
梁尚君 2004-08-30
  • 打赏
  • 举报
回复
不知道搂主怎么写的
for(int i = n - 1; i > 0; i--)
if(a[i] > x)
for(int j = (n - 1); j >= i; j--) a[j] = a[j - 1];
执行完之后i的值是多少???
当a[i]<x的时候,i 还在自减

jp1984 2004-08-30
  • 打赏
  • 举报
回复
给点面子。 。我的程序完全通过的。兄弟,塌实点好不好?
moffatte 2004-08-30
  • 打赏
  • 举报
回复
to goodboy1881(三井):
你的程序我调试过了,缺少对 0 的测试。
to jp1984(毛咏洁):
你的程序和我以前犯了同样的错误,会出现覆盖数组元素的情况。
to whq263(玄豹):
也是缺少对 0 的测试。达不到和 while 那段相同的效果。
我现在的想法是:把 0 这种情况单独考虑,
void insert(float a[], int& n, float x){
for(int i = n-1; i >=0; )
{
if(x == 0){
//在这里插入语句,使数组元素后移
}
if(a[i] > x)
i--;
else
{
for(int j = n; j > i+1; j--)
a[j] = a[j-1];
a[j] = x;
break;
}
}
++n;
}
不过这样看来还是没有用 while 写的那段好。
玄豹 2004-08-30
  • 打赏
  • 举报
回复
楼主,你那样当然不行呀:

在VC环境下通过调试:
#include <stdio.h>

void insert(float a[], int& n, float x){
for(int i = n-1; i >=0; )
{
if(a[i] > x)
i--;
else
{
for(int j = n; j > i+1; j--)
a[j] = a[j-1];
a[j] = x;
break;
}
}
++n;
}

void main()
{
float a[8] = {1,3,5,6}; //这里定义一个存储8个数的一维数组是为了有多余空                 //间存储要插入的数,如果没有给出,运行会出现异常
float x=4;
int n,i;
n=4;
insert(a,n,x);
printf("n=%d\n",n);
for(i=0;i<n;i++)
printf("%f ",a[i]);
printf("\n");
}


65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧