插入排序程序

Insertion Sort program

本文关键字:程序 插入排序      更新时间:2023-10-16

(一点背景,所以你不会讨厌我,如果这篇文章对于这个论坛来说是多余的或太基础,我最深切的歉意)-

是一名高中生和初学者,最近刚开始学习 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);

}