首页 > 解决方案 > C ++选择排序不排序数组的某些值

问题描述

我正在尝试使用选择排序算法对整数数组进行排序,但有些数字没有排序。下面是我的代码的隔离部分,它进行排序和输出。有什么建议么?

#include <iostream>

using namespace std;

int main()
{
    int smallestIndex;
    int temp;
    
    int X[13] = {1, 19, 2, 18, 4, 12, 7, 8, 10, 3, 11, 17, 9};
    
    for (int Index = 0; Index < 12; Index++) {
        smallestIndex = Index;
        for (int minIndex = Index+1; minIndex < 13; minIndex++) {
            if (X[minIndex] < X[smallestIndex]) {
                smallestIndex=minIndex;
            }
            if (smallestIndex != Index) {
                temp = X[Index];
                X[Index] = X[smallestIndex];
                X[smallestIndex] = temp;
            }
        }
    }
    
    for (int i = 0; i < 13; i++) {
        cout << X[i] << endl;
    }
}

输出:

1                                                                  
2                                                                  
4                                                                  
7                                                                  
9                                                                  
3                                                                  
10                                                                 
8                                                                  
11                                                                 
12                                                                 
17                                                                 
18                                                                 
19

标签: c++algorithmsortingfor-loopif-statement

解决方案


有一种更简单的方法可以做到这一点,即使用该swap()函数,并使用另外两个调用的函数,void selectionSort()并使void printArray()代码看起来更清晰。

#include <iostream> 
#include <algorithm>

  
void swap(int *xp, int *yp)  
{  
    int temp = *xp;  
    *xp = *yp;  
    *yp = temp;  
}  
  
void selectionSort(int arr[], int n)  
{  
    int i, j, min_idx;  
  
    // One by one move boundary of unsorted subarray  
    for (i = 0; i < n-1; i++)  
    {  
        // Find the minimum element in unsorted array  
        min_idx = i;  
        for (j = i+1; j < n; j++)  
        if (arr[j] < arr[min_idx])  
            min_idx = j;  
  
       
        swap(&arr[min_idx], &arr[i]);  
    }  
}  
  

void printArray(int arr[], int size)  
{  
    int i;  
    for (i=0; i < size; i++)  
        std::cout << arr[i] << " ";  
    std::cout << std::endl;  
}  
  
 
int main()  
{  
    int arr[] = {1, 19, 2, 18, 4, 12, 7, 8, 10, 3, 11, 17, 9}; 
    int n = sizeof(arr)/sizeof(arr[0]);  
    selectionSort(arr, n);  
    std::cout << "The sorted array is: \n";  
    printArray(arr, n);  
    return 0;  
}  

输出:

The sorted array is: 
1 2 3 4 7 8 9 10 11 12 17 18 19 

您可以做到这一点的另一种方法是仅严格使用std::swap而不使用pointers. 确保#include<algorithm>包含std::swap. 您还需要包括#include <iterator>for std::size

#include <iostream> 
#include <algorithm>
#include <iterator>
 
int main()
{
     int arr[] = {1, 19, 2, 18, 4, 12, 7, 8, 10, 3, 11, 17, 9}; 
    constexpr int length{ static_cast<int>(std::size(arr)) };
    //constexpr means that value of a variable can appear in a constant expression.
 
    // Step through each element of the array
    
    for (int startIndex{ 0 }; startIndex < length - 1; ++startIndex)
    {
        
        int smallestIndex{ startIndex };
 
        // Then look for a smaller element in the rest of the array
        for (int currentIndex{ startIndex + 1 }; currentIndex < length; ++currentIndex)
        {
            if (arr[currentIndex] < arr[smallestIndex])
            
                smallestIndex = currentIndex;
        }
 
        
                // swap our start element with our smallest element 
        std::swap(arr[startIndex], arr[smallestIndex]);
    }
 
    // Now that the whole array is sorted, print it.
    for (int index{ 0 }; index < length; ++index)
        std::cout << arr[index] << ' ';
 
    std::cout << '\n';
 
    return 0;
}

你也可以std::sort改用。它位于头文件#include<algorithm>中,默认情况下仅按升序排序。您还需要头#include <iterator>文件std::size

#include <iostream> 
#include <algorithm>
#include <iterator> 
 
int main()
{
    int arr[] = {1, 19, 2, 18, 4, 12, 7, 8, 10, 3, 11, 17, 9}; 
 
    std::sort(std::begin(arr), std::end(arr));
 
    for (int i{ 0 }; i < static_cast<int>(std::size(arr)); ++i)
        std::cout << array[i] << ' ';
 
    std::cout << '\n';
 
    return 0;
}

推荐阅读