主要是对过程的记录,感觉是用动态数组做的,但是太菜了不会就自己用一个数组来时时记录,不过时间复杂度就大了很多,还是就是控制从大到小的输出,也是一个考验,可以看一下引用,显示怎么让结尾的空格去掉。
另外就是快速排序,正好算法课用到了,就直接引用的函数,因为需要同时排序两个数组,但是是同一个下标,就稍微更改了下。下面是完整的代码
#include<iostream>
#include<string>
using namespace std;
int Partition(int r[],int r1[], int first, int end) {
int i = first, j = end;
while (i < j) {
while (i < j&&r[i] >= r[j])j--;
if (i < j) {
int temp = r[i];
r[i] = r[j];
r[j] = temp;
temp = r1[i];
r1[i] = r1[j];
r1[j] = temp;
i++;
}
while (i < j&&r[i] > r[j])i++;
if (i < j) {
int temp = r[i];
r[i] = r[j];
r[j] = temp;
temp = r1[i];
r1[i] = r1[j];
r1[j] = temp;
j--;
}
}
return i;
}
void QuickSort(int r[],int r1[], int first, int end) {
int pivot;
if (first < end) {
pivot = Partition(r,r1, first, end);
QuickSort(r, r1, first, pivot - 1);
QuickSort(r, r1, pivot + 1, end);
}
}
int main() {
int n, k[100], k1[100] = { 0 };
cin >> n;
for (int i = 0; i < n; i++) {
cin >> k[i];
}
for (int i = 0; i < n; i++) {
int temp = k[i];
while (temp != 1) {
if (temp % 2 == 0) {
temp = temp / 2;
}
else {
temp = (3 * temp + 1) / 2;
}
for (int j = 0; j < n; j++) {
if (temp == k[j]) {
k1[j]++;
}
}
}
}
QuickSort(k, k1, 0, n - 1);
int flag = 0;
for (int i = 0; i < n; i++) {
if (k1[i] == 0&&flag == 0) {
cout << k[i];
flag++;
}
else if(k1[i]==0&&flag!=0){
cout << " " << k[i];
}
}
cout << endl;
return 0;
}