使用选择排序按最小数字排序

sorting by smallest digit using selection sort

本文关键字:排序 小数 数字 选择      更新时间:2024-09-26

我的任务是使用选择排序按数字的最小数字对数组进行排序。例如:61<35,因为1<3.如果数字一致,我必须打印2中最小的一个。这就是我的代码:

#include <iostream>
#include <time.h>
using namespace std;

int smallestOfTwo(int a, int b) {
if (a < b) return a;
else return b;
}
int smallestDigit(int a) {
int smallDigit = 9;
while (a != 0) {
if (a % 10 < smallDigit) {
smallDigit = a % 10;
}
a /= 10;
}
return smallDigit;
}
void selectionSort(int arr[], const int size) {
for (int i = 0; i < size - 1; i++) {
int min = i;
for (int j = i + 1; j < size; j++) {
if (smallestDigit(arr[j]) == smallestDigit(arr[min])) min = smallestOfTwo(j, min);
else if (smallestDigit(arr[j]) < smallestDigit(arr[min])) min = j;
}
if (min != i) {
swap(arr[min], arr[i]);
}
}
}
int main() {
srand(time(NULL));
const int size = 5;
int arr[size];
for (int i = 0; i < size; i++) {
arr[i] = rand() % 201;
cout << arr[i] << " ";
}
cout << "n--------------------------------------------------------------------------------------n";
selectionSort(arr, size);
for (int i = 0; i < size; i++) cout << arr[i] << " ";
return 0;
}

问题是,对于某些数字,它是有效的(例如,对于23 63 70 37 183,输出是正确的:70 183 23 37 63(,但对于一些数字,它不起作用(例如,27 26 156 178 47。输出是156 178 27 26 47,但应该是156 178 26 27 47(,我不知道为什么。任何帮助都将不胜感激。谢谢

26和27都有最小的数字2,因此它们是等价的,并且可以在结果中按任何顺序排列。为了保持原始顺序,您可以尝试查找";稳定排序;若要回退到第二小数字、第三小数字等,您可以对每个数字进行计数和比较。

struct digit_counts {
int counts[10];
};
digit_counts convert(int a) {
digit_counts out = {};
while (a != 0) {
++out.counts[a % 10];
a /= 10;
}
return out;
}
bool operator<(const digit_counts& dc1, const digit_counts& dc2) {
for (int i = 0; i < 10; ++i) {
if (dc1.counts[i] > dc2.counts[i]) {
return true;
}
else if (dc2.counts[i] > dc1.counts[i]) {
return false;
}
}
return false;
}

如果你想回到两者中较小的一个,那么写你自己的比较函数。

bool special_less_than(int a, int b) {
int small_digit_a = smallestDigit(a);
int small_digit_b = smallestDigit(b);
if (small_digit_a < small_digit_b) {
return true;
}
else if (small_digit_a > small_digit_b) {
return false;
}
else {
return a < b;
}
}