C++ 插入排序并统计数值出现的次数

运行结果: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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值