运行结果:N:出现在数组中的数值,Count:该数字出现的次数。
Ascending sort: -12 -12 -12 -12 0 0 1 1 1 2 2 3 3 3 4 4
Descending sort: 4 4 3 3 3 2 2 1 1 1 0 0 -12 -12 -12 -12
N Count
4 2
3 3
2 2
1 3
0 2
-12 4
insertionSort.cpp
#include <iostream>
#include <string>
using namespace std;
void ascendingSort(int ar[], const int LEN); // 插入排序升序
void cmpInt(int ar[], const int len); // 将数字插入到数组中正确的位置(升序,函数名取的不好,懒得改了)
void descendingSort(int ar[], const int LEN); // 插入排序降序
void cmpInt1(int ar[], const int len); // 将数字插入到数组中正确的位置(降序,函数名取的不好,懒得改了)
void show(int ar[], const int LEN); // 在屏幕上显示数组
string countNumber(int ar[], const int LEN); // 计算数字在数组中出现的次数
string reverseStr(string s); // 反转字符串
string intToString(int a); // 整型转字符型
int main() {
const int LEN = 16;
int ar[LEN] = {-12, 3, -12, 4, 1, 1, -12, 1 -1, 1, 2, 3, 4, 2, 3, -12};
cout << "Ascending sort: ";
ascendingSort(ar, LEN);
show(ar, LEN);
cout << "Descending sort: ";
descendingSort(ar, LEN);
show(ar, LEN);
string n = countNumber(ar, LEN);
cout << "N\t\tCount\n" << n;
return 0;
}
void ascendingSort(int ar[], const int LEN) {
for (int i = 1; i < LEN; i++)
cmpInt(ar, i);
}
void cmpInt(int ar[], const int index) {
int i, element = ar[index];
for (i = index - 1; i >= 0 && ar[i] > element; i--)
ar[i + 1] = ar[i];
ar[i + 1] = element;
}
void descendingSort(int ar[], const int LEN) {
for (int i = 1; i < LEN; i++)
cmpInt1(ar, i);
}
void cmpInt1(int ar[], const int index) {
int i, element = ar[index]; // 将当前元素的值保存到临时变量中
for (i = index - 1; i >= 0 && ar[i] < element; i--)
ar[i + 1] = ar[i];
ar[i + 1] = element;
}
string countNumber(int ar[], const int LEN) {
string s;
int tmp = ar[0], n = 1;
for (int i = 1; i < LEN; i++) {
while (tmp == ar[i]) {
i++;
n++;
}
/* (tmp < 0 ? '-' + intToString(tmp * -1) : intToString(tmp)) 等于下面语句:
* if (tmp < 0)
* s += '-' + intToString(tmp * -1) + "\t\t" + intToString(n) + '\n';
* else
* s += intToString(tmp * -1) + "\t\t" + intToString(n) + '\n';
* 因为tmp为负数时,负号不需要转换成字符,所以要 tmp * -1 将其转换为正数
* /
s += (tmp < 0 ? '-' + intToString(tmp * -1) : intToString(tmp))+ "\t\t" + intToString(n) + '\n';
tmp = ar[i];
n = 1;
}
return s;
}
void show(int ar[], const int LEN) {
for (int i = 0; i < LEN; i++) {
cout << ar[i] << " ";
}
cout << "\n";
}
string intToString(int a) {
string reverseS;
do {
reverseS += a % 10 + '0';
} while (a /= 10);
string s = reverseStr(reverseS);
return s;
}
string reverseStr(string s) {
string reverseS;
/* 因为 s.length()返回值类型为 unsigned long, 直接将返回值赋给i编译器会警告,要用
* static_cast<int>(s.length()) 将其转换为 int 类型,不要用强制类型转换,有安全隐患。
*/
int i = static_cast<int>(s.length());
while (--i >= 0) {
reverseS += s[i];
}
return reverseS;
}