插入排序的问题

scorpio801 2014-09-01 06:56:06
void InsertSorts(int a[], int n)
{
for(int i = 1; i != n; ++i)
{
int temp = a[i];
for(int j = i - 1; j >= 0; --j)
{
if(a[j] > temp)
{
a[j + 1] = a[j];
}
}
a[j] = temp;
}
}

这一段代码为什么不能正确的排序,实在找不出问题在哪里
...全文
72 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
scorpio801 2014-09-02
  • 打赏
  • 举报
回复
已排序序列是递增的,从后往前找合适的位置插入元素,假设某个a[j] < temp,那么a[j]前面的元素都会小于temp,也不会执行if语句,else语句不是多余的嘛? break是退出当前循环,还是退出整个循环?
M_HANDLE 2014-09-02
  • 打赏
  • 举报
回复
引用 4 楼 scorpio801 的回复:
void InsertSortss(int a[], int n)
{
	for(int i = 1; i != n; ++i)
	{
		int j = i - 1;
		int temp = a[i];
		while(a[j] > temp)
		{
			a[j + 1] = a[j];
			--j;
		}
		a[j + 1] = temp;
	}
}
为什么这样写就是对的,感觉两个逻辑是一样的
while就隐含了有else的意思啊,不满足a[j] > temp就退出循环,和for循环里面加else break的效果一样
scorpio801 2014-09-02
  • 打赏
  • 举报
回复
为什么加上else语句就对了,不加就错了?
scorpio801 2014-09-02
  • 打赏
  • 举报
回复
void InsertSortss(int a[], int n)
{
	for(int i = 1; i != n; ++i)
	{
		int j = i - 1;
		int temp = a[i];
		while(a[j] > temp)
		{
			a[j + 1] = a[j];
			--j;
		}
		a[j + 1] = temp;
	}
}
为什么这样写就是对的,感觉两个逻辑是一样的
阿麦 2014-09-01
  • 打赏
  • 举报
回复
哎,大意了。这个才对。

void InsertSorts(int a[], int n)
{
	for(int i = 1; i != n; ++i)
	{
		int temp = a[i];
		for(int j = i - 1; j >= 0; --j)
		{
			if(a[j] > temp)
			{
				a[j + 1] = a[j];
			}
			else
			{
				break;
			}
		}
		a[j+1] = temp;
	}
}
阿麦 2014-09-01
  • 打赏
  • 举报
回复
a[j] = temp; 改: a[max(0,j)] = temp;
阿麦 2014-09-01
  • 打赏
  • 举报
回复

void InsertSorts(int a[], int n)
{
	for(int i = 1; i != n; ++i)
	{
		int temp = a[i];
		for(int j = i - 1; j >= 0; --j)
		{
			if(a[j] > temp)
			{
				a[j + 1] = a[j];
			}
			else
			{
				break;
			}
		}
		a[j] = temp;
	}
}

64,648

社区成员

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

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