插入排序程序

时间:2014-12-28 15:28:49

标签: c++ algorithm sorting c++11

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

我是一名高中生和初学者,他刚刚开始学习c ++,在我学习数组时,我遇到了插入排序算法。一开始理解起来非常混乱,但在观看了几个视频后我尝试制作自己的版本。

程序本身非常简单:我向用户询问数组的大小,然后是元素。然后我想按升序对元素进行排序,但问题是,输出并不是我所期望的。

因此,当用户输入类似[4,2,1,3]的内容时,我会看到[1,1,2,3]而不是打印[1,2,3,4]! 该程序只有一个函数,它只打印数组并为除最后一个元素之外的每个元素添加逗号。请不要关闭这个帖子,因为我搜索的时间很长,找不到类似的东西,如果这是多余的话,我再次感到非常抱歉。

#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);


 }

3 个答案:

答案 0 :(得分:1)

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];

答案 1 :(得分:0)

除了音色的答案(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;
        }   
    }   
}

答案 2 :(得分:0)

你可以试试。简单更改。使用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更改。所以它解雇插入排序技术。

希望它是okk。

#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);


}