#include<iostream> //二叉树排序(char型,C++)
using namespace std; //数组下标从1开始
#include<string.h>
void move_char(char a[]) { //将数组a整体向后移动一位,让a[0]失效
for (int i = strlen(a); i > 0; i--) {
a[i] = a[i - 1];
}
}
void exch_char(char a[], int i, int j) { //交换a[i]和a[j]的值
char temp;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void swim_char(char a[], int k) { //上浮第k位置的元素 至合适的位置(树由上到下降序)
while (k > 1 && a[k / 2] < a[k]) {
exch_char(a, k / 2, k);
k = k / 2;
}
}
void sink_char(char a[], int k, int a_length) { //下沉第k位置元素,优先与左右孩子中最大的互换位置(树由上到下降序)
while (2 * k <= a_length) { //a_length为数组a去除a[0]后的长度
int j = 2 * k;
if (j < a_length && a[j] < a[j + 1]) j++;
if (!(a[k] < a[j])) break;
exch_char(a, k, j);
k = j;
}
}
void BiTree_sort_char(char a[]) { //二叉树排序,a_length为数组a去除a[0]后的长度
int a_length = strlen(a) - 1;
for (int k = a_length / 2; k >= 1; k--) { //使二叉树有序(由上到下降序)
sink_char(a, k, a_length);
}
while (a_length > 1) { //由上到下升序排序
exch_char(a, 1, a_length--);
sink_char(a, 1, a_length);
}
}
int main() {
char a[100] = {};
cout << "请输入要排序的字符串:" << endl;
cin >> a;
move_char(a); //a[0]不用
BiTree_sort_char(a);
cout << endl;
cout << "升序后的结果为:" << endl;
for (int i = 1; i <= strlen(a); i++) {
cout << a[i] << " ";
}
cout << endl;
return 0;
}
测试结果: