插入排序程序
Insertion Sort program
(一点背景,所以你不会讨厌我,如果这篇文章对于这个论坛来说是多余的或太基础,我最深切的歉意)-
我是一名高中生和初学者,最近刚开始学习 c++,当我学习数组时,我遇到了插入排序算法。起初很难理解,但在看了几个视频后,我尝试制作自己的版本。
程序本身非常简单:我询问用户数组的大小,然后询问元素。然后我想按升序对元素进行排序,但问题是,输出并不完全符合我的预期。
因此,当用户输入类似 [4,2,1,3] 的内容时,我看到的是 [1,1,2,3],而不是打印 [1,2,3]!该程序只有一个函数,它只打印数组并向除最后一个元素之外的每个元素添加一个逗号。请不要关闭此线程,因为我搜索了很长时间,找不到类似的东西,如果这是多余的,我再次感到非常抱歉。
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
void DisplayArray (int size, int array[]) {
for (int k=0; k< size; k++) {
if (k!=size-1) {
cout << array[k] << ", ";
}
else {
cout << array[k] << ".";
}
}
}
int main(int argc, const char * argv[]) {
int size;
cin >> size;
int array[size-1];
for (int j=0; j< size; j++) {
cin >> array[j];
}
for (int i =1; i<size; i++) {
int value = array[i];
int m = i - 1;
while (m >= 0){
if (value < array[m]) {
array [i] = array[m];
array [m] = value;
m = m - 1;
}
else {
break;
}
}
}
DisplayArray(size, array);
}
int array[size-1];
for (int j=0; j< size; j++) {
cin >> array[j];
}
这里你声明了一个带有 size-1
的数组,因此合法索引是 [0, size-2],而不是 [0, size-1]。
由于您期望一个包含 size
元素的数组,只需声明为 int array[size];
.
除了音色的答案(int array[size];
),下面这个块还有一个问题
for (int i =1; i<size; i++) {
int value = array[i];
int m = i - 1;
while (m >= 0){
if (value < array[m]) {
array [i] = array[m];
array [m] = value;
m = m - 1;
}
else {
break;
}
}
}
第 array[i] = array[m]
行以错误的方式覆盖array[i]
。应该是array[m + 1] = array[m]
.
该块在可读性方面可以稍微改进一点;
for (int i = 1; i < size; i++) {
int j = i;
while (j > 0) {
if (array[j] < array[j - 1]) {
// swap two elements, could be done with std::swap()
int tmp = array[j];
array [j] = array[j - 1];
array [j - 1] = tmp;
j = j - 1;
} else {
// beginning of an array is sorted, stop iterate
break;
}
}
}
你可以试试。 简单的更改.use array[size]
不使用array[size-1]
因为数组索引array[0,1,2,3,----size-1]
对于array[size]
和
对于插入排序,请使用array [m+1] = array[m]
替换array[i]=array[m]
因为当您使用array[i]
时,在循环中i
固定的,但m
变化。 所以它是忽略插入排序技术。
希望没事。
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
void DisplayArray (int size, int array[])
{
for (int k=0; k< size; k++)
{
if (k!=size-1)
{
cout << array[k] << ", ";
}
else
{
cout << array[k] << ".";
}
}
}
int main()
{
int size;
cin >> size;
int array[size];
for (int j=0; j< size; j++)
{
cin >> array[j];
}
for (int i =1; i<size; i++)
{
int value = array[i];
int m = i - 1;
while (m >= 0)
{
if (value < array[m])
{
array [m+1] = array[m];
array [m] = value;
m = m - 1;
}
else
{
break;
}
}
}
DisplayArray(size, array);
}
- 使用C++程序合并排序没有得到正确的输出
- 这是插入排序的正确实现吗?
- 使用列表 STL 递归进行插入排序
- 列表 iter 不取消引用 使用列表进行插入排序
- 如何使插入排序更快?
- 插入排序的最小交换
- 双链表C++上的插入排序
- 在控制台上输出我从文件中读取的整数,将程序插入无限循环
- 如何在插入排序中使用 replace() 使语句变得不必要
- C++插入排序错误功能不起作用
- 如何在不通过插入排序更改原始矢量的情况下对 2D 矢量进行排序
- 插入排序打印错误的输出
- 从矢量末尾开始的插入排序
- 插入排序:我做错了什么?
- 插入排序的向量<unique_ptr<对时避免堆分配<>>>
- 获取有趣的输出以进行插入排序
- 插入排序算法在放入函数时的行为不同
- 插入排序的Valgrind Invalid读取尺寸8的尺寸
- 插入排序使我的程序崩溃
- 插入排序程序