Прехвърляне към съдържание


Снимка

Сортиране на масив чрез вмъкване


  • Моля, влезте, за да отговорите
5 отговора по тази тема

#1 Evertom

Evertom

    Потребител

  • Потребители
  • ПипПипПипПипПипПип
  • 166 мнения

Публикувано: 21 January 2013 - 21:30

Здравейте,наясно съм с принципа на работа на този вид сортиране.Разбирам го чисто алгоритмично,но не мога да разбера как е направен в c++ кода,гледам го кода и не мога да го разбера а и никъде не е обяснено кое какво прави.Ако може малко помощ с обяснението.

Ето го и кода


#include<iostream>
using namespace std;
int main()
{
int Masiv[5]={20,31,42,52,30};
int i,j,index;

for(i=1;i<5;i++){
index=Masiv[i];
j=i;

whie( (j>0) && (Masiv[j-1]>index) )
{ Masiv[j]=Masiv[j-1];
j=j-1;}
Masiv[j]=index;

}}


for(int i=0;i<5;i++)
cout<<Masiv[i]<<" ";
return 0;
}


Частта с различен шрифт и цвят е същинското сортиране.Кода го намерих в интернет и се надявах че ще го разбера като гледах алгоритъма за сортиране и следвам кода,но изобщо не виждам как този код следва алгоритъма.

#2 s.feradov

s.feradov

    Потребител

  • Глобални модератори
  • ПипПипПипПипПипПип
  • 1603 мнения
  • Пол:Мъж

Публикувано: 21 January 2013 - 22:59

Методът се гради на два масива - масив с ненаредени стойности и готовия масив със сортирани такива.

Първоначално се присвоява стойността на даден елемент от масива на декларираната променлива index. След което, на другата декларирана променлива j се присвоява стойността на i.

Цикълът while е въведен по следния начин:
while((j>0) && (Masiv[j-1]>index)

В този случай се задава условието, че за да се изпълни цикъла и двата израза трябва да бъдат истина. При True, цикълът се задейства и на съответния елемент от масива ( Masiv[j] ) се присвоява стойността на елемента Masiv[j-1], тъй като от цикъла следва, че
Masiv[j-1]> index
т.е. предишния елемент е по-голям от следващия в подредбата.

Най-накрая се присвоява стойността на index на елемента Masiv[j] и цикълът for започва да се повтаря докато:
i<5 = False

"There isn't a person anywhere who isn't capable of doing more than he thinks he can." - Henry Ford


#3 Evertom

Evertom

    Потребител

  • Потребители
  • ПипПипПипПипПипПип
  • 166 мнения

Публикувано: 21 January 2013 - 23:23

Благодаря за отговора,но това ми е ясно.Как се задават и т.н.не мога да разбера логиката по която се прави,защо точно така се пише.Тоест не мога да си представя как тези команди ще подредят числата,не разбирам как ще го направят.
Например имаме редицата 3 5 1.Можеш ли да обясниш стъпка по стъпка какво ще направят командите с числата,защото така нищо не разбирам.
Може ако искаш само за едно минаване през цикъла да обясниш защото иначе писането сигурно ще е много.

#4 s.feradov

s.feradov

    Потребител

  • Глобални модератори
  • ПипПипПипПипПипПип
  • 1603 мнения
  • Пол:Мъж

Публикувано: 21 January 2013 - 23:52

Добре.

Да приемем, че това е кодът:

int Masiv[3]={3,5,1}
int i,j,index;

for(i=1;i<5;i++)
{
index=Masiv[i];
j=i;
while((j>0)&&(Masiv[j-1]>index))
{
Masiv[j]=Masiv[j-1];
j=j-1;
}
Masiv[j]=index;
}

Първи цикъл:

index = 5 //5=Masiv[1]
j=1
while ((j>0)&& (Masiv[0]> index)) //false
Masiv[1] = 5

Втори цикъл:

index = 1 //1 = Masiv[2]
j=2
while ((j>0) && (Masiv[1]> index)) // True
Masiv[2]=5 // Masiv[1] =5
j=1
while ((j>0) && (Masiv[0]>index)) //True
Masiv[1] = 3 //Masiv[0] = 3
j=0 -> Край на цикъл.
Masiv[0] = 1

Допълнително описание:

Резултат от първи цикъл на for: 3,5,1
Резултат от втори цикъл на for:
Първи цикъл на while: 3,1,5
Втори цикъл на while: 1,3,5

"There isn't a person anywhere who isn't capable of doing more than he thinks he can." - Henry Ford


#5 Evertom

Evertom

    Потребител

  • Потребители
  • ПипПипПипПипПипПип
  • 166 мнения

Публикувано: 22 January 2013 - 00:16

3 5 1
Мисля че го разбрах while проверява условието дали има лявостоящо число по-голямо от дясно стоящото например 5>1 и 1 трябва да се размени със 5-цата.Изпълняват се командите във цикъла while и списъка с цифри ще изглежда така 3 5 5.Сваляме j с 1 и проверяваме дали отговаря на условията на while в случая j=1 и masiv[0]=3 > index=1 и пак изпълняваме командите в цикъла while,списъка става 3 3 5.
j-1=0 и този път вече не отговаря на на условията затова отиваме директно на
Masiv[j]=index; и списъка става 1 3 5 и вече е подреден.

Доста е трудно да се осмисли всичко това,никога не бих се сетил сам да напиша кода. :bored: Сега горе долу ми се изясни благодаря за помощта :bravo:

#6 s.feradov

s.feradov

    Потребител

  • Глобални модератори
  • ПипПипПипПипПипПип
  • 1603 мнения
  • Пол:Мъж

Публикувано: 22 January 2013 - 00:22

Основната функция на while тук е точно такава. Проверка на това, дали дадена стойност е по-висока от предходната. Ако е, то цикълът приключва тъй като едно от условията не е удовлетворено. Ако стойността е по-ниска, то се изпълняват командите в while блока и стойността се присвоява на по-преден елемент в масива.

"There isn't a person anywhere who isn't capable of doing more than he thinks he can." - Henry Ford





0 потребители четат тази тема

0 регистрирани потребители, 0 гости и 0 анонимни потребители