c++ - 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
解决方案
有一种更简单的方法可以做到这一点,即使用该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;
}
推荐阅读
- reactjs - 如何将 3 个输入元素中的单个输入元素传递给反应钩子中的组件
- sql - 仅选择具有最大值的行,但具有此信息的列是 SUM()
- python - 每次运行 Python 脚本时,如何创建一个新的 excel 文件?
- jupyter - jupyter labextension 安装 @jupyter-widgetes/jupyterlab-manager
- android - SERVICE_MISSING/SERVICE_DISABLED 错误 - react-native-youtube
- c# - Scaffold-DbContext 实例失败 - 从现有数据库创建模型(具有个人身份的项目)
- python - 具有张量积和薄板回归样条函数的GAM Python包
- python - 遍历两个列表以查找第一个列表中的元素是否存在于第二个列表中
- mysql - 不同条件的 SQL SELECT COUNT
- xamarin.forms - 如何从 xamarin 表单应用程序从 onedrive 导入照片