[英]C++ : 2-D Pointer Array Sorting: Selection Sort doesn't work for certain instance
[英]C++ Selection Sort not Sorting Some Values of an Array
我正在嘗試使用選擇排序算法對整數數組進行排序,但有些數字沒有排序。 下面是我的代碼的隔離部分,它進行排序和 output。 有什么建議么?
#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;
}
}
output:
1
2
4
7
9
3
10
8
11
12
17
18
19
通過使用swap()
function 並使用另外兩個稱為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;
}
Output:
The sorted array is:
1 2 3 4 7 8 9 10 11 12 17 18 19
您可以做到這一點的另一種方法是嚴格使用std::swap
而不使用pointers
。 確保包含std::swap
的#include<algorithm>
header 文件。 您還需要為std::size
包含#include <iterator>
。
#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
。 它在 header 文件#include<algorithm>
中,默認情況下只是按升序排序。 您還需要 header 文件#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};
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.