(Немного фона, чтобы вы не ненавидели меня, мои самые глубокие извинения, если этот пост лишний или слишком простой для этого форума) -
Я ученик средней школы и начинающий, и я только недавно начал изучать c++, и пока я изучал массивы, я столкнулся с алгоритмом сортировки вставки. Было довольно сложно понять сначала, но, посмотрев пару видеороликов, я попытался сделать свою собственную версию.
Сама программа очень проста: я запрашиваю у пользователя размер массива, а затем элементы. Затем я хочу отсортировать элементы в порядке возрастания, но проблема в том, что результат не совсем то, что я ожидаю.
Поэтому, когда пользователь вводит что-то вроде [4,2,1,3], вместо печати [1,2,3,4], я вижу [1,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];
) возникает проблема со следующим блоком
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;
}
}
}
int array[size-1];
for (int j=0; j< size; j++) {
cin >> array[j];
}
Здесь вы объявили массив с size-1
, поэтому юридический индекс [0, размер-2], а не [0, размер-1].
Поскольку вы ожидаете массив с элементами size
, просто объявите как int array[size];
,
можешь попробовать. простой change.use array[size]
не использовать array[size-1]
потому что массив индексирования является array[0,1,2,3,----size-1]
для array[size]
и
для array [m+1] = array[m]
сортировки вставки 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);
}