Member 13067828 Ответов: 2

Сортировка выбора с заменой двух элементов


Поэтому вместо того,чтобы найти только минимум, я должен найти минимальное значение и второе минимальное значение и сохранить его в нужном месте.
мой код работает не во всех случаях
например
#include <iostream>
void AdvancedSelectionSort(int data[], int n)
{ 
	for(int i=0;i<n-1;i=i+2){
		int smallest,secondsmallest;
		 
	  smallest=i;
	  secondsmallest=i+1;


	for(int j=i+1;j<n;j++)
	{
		
		if(data[j]<=data[smallest]){
	    secondsmallest=smallest;
		smallest=j;}

		else if(data[j]<=data[secondsmallest])
			secondsmallest=j;
	}

	
	  
	if(secondsmallest!=(i+1))
		Swap(data[i+1],data[secondsmallest]);

	if(smallest!=i)
		Swap(data[i],data[smallest]);

	
	
	
	
	}
}


int main(){
	int x[10]=[2,5,8,7,9,12,88,74,3,10]
	AdvancedSelectionSort(x,10);
	for(int i=0;i<10;i++)
		cout<<x[i]<<" ";



}



Что я уже пробовал:

аннулировать своп(инт &усилителя;телевизор,инт&усилителя;б)

{int temp=a;
a=b;
b=температура;}


void AdvancedSelectionSort(int data [], int n)
{
для(int i=0;i< n-1;i=i+2){
int самый маленький, второй по величине;

маленький=я;
secondsmallest=i+1;


for (int j=i+1;j< n; j++)
{

if (data[j]<=data[наименьший]){
secondsmallest=наименьший;
наименьший=j;}

else if (data[j]<=data[secondsmallest])
secondsmallest=Дж;
}



если (secondsmallest!=(i+1))
Swap (data[i+1], data[secondsmallest]);

если (наименьший!=i)
Swap (data[i], data[наименьший]);





}
}

0x01AA

Если отсортировать список данных, то можно получить минимум второй, и третий, и третий...
В чем проблема?

Member 13067828

его сортировка не всегда корректна

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Объясните это и приведите примеры данных (входных и выходных, которые демонстрируют проблему.
Обновите свой код до полной функции, чтобы мы могли его запустить.

Member 13067828

Я обновил эту функцию

Member 13067828

что касается примера
он не сортирует этот массив x[8]={2,7,9,5,6,7,8,10};
выход 2 5 6 7 8 9 7 10

2 Ответов

Рейтинг:
1

OriginalGriff

Если ваша задача состоит в том, чтобы отсортировать данные, а затем получить наименьшие два элемента, то перестаньте искать наименьший и второй наименьший и сосредоточьтесь на том, чтобы сортировка работала. Удалите весь "самый маленький" код и просто сортируйте.
Когда у вас это работает, самые маленькие два-это первый и второй элементы результирующего массива...

Если вы не должны сортировать его, то вы можете найти наименьшее и второе наименьшее за один проход через данные: создайте наименьшие и вторые наименьшие переменные и установите для них максимальное значение, которое может содержать целое число.
Пройдите через данные и сравните каждое значение (V) со вторым наименьшим (S2). Если он меньше, сравните его с самым маленьким (S1). Затем:
если V >= S2, игнорируйте его.
если V < S2 и V >= S1, установите S2 на V.
если V < S2 и V < S1 устанавливают S2 в S1, установите S1 в V.
В конце цикла у вас есть самый маленький и второй самый маленький.


Member 13067828

это не концепция сортировки выбора, я должен найти индекс наименьшего и второго наименьшего, а затем поменять их местами с правильными местами

Рейтинг:
0

Patrice T

for(int i=0;i<n-1;i=i+2){
    int smallest,secondsmallest;

  smallest=i;
  secondsmallest=i+1;

Подумайте об этом: что происходит, когда данные[i] не меньше данных[i+1] ?

Когда вы не понимаете, что делает ваш код или почему он делает то, что делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволяет вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения, это невероятный инструмент обучения.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010-YouTube[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.

[Обновление]
Между прочим:
int x[10]=[2,5,8,7,9,12,88,74,3,10]

отсутствует буква"; " в конце строки.

Попробуйте с:
int x[10]=[2,1,4,3,6,5,8,7,10,9];

чтобы увидеть проблему, когда data[i] не меньше data[i+1]


Member 13067828

я просто предполагаю, что "самый маленький" и "второй самый маленький" , вот почему я вызываю функцию swap++, циклическую из j=i+1

Patrice T

Используйте отладчик и посмотрите, что произойдет.

Member 13067828

Я не мог найти :/

Patrice T

Google с вашим именем компилятора / IDE и отладчиком.