本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
代码示例:
#include<stdio.h>
#include<string.h>
int main()
{
char str[80],comp[80],temp;
int i=1,j=1,s=0,tag = 0,min;
while(s<80){
str[s] = ' ';
comp[s] = ' ';
s++;
}//完成初始化;
gets(str);
comp[0] = str[0];
while(str[i]!='\0'){
for(int k=0;k<j;k++){
if(str[i]==comp[k]) {tag = 1; break;}//如果存在相等退出循环.tag=1表示元素有重复;
}
if(tag==0){
comp[j] = str[i];
j++;
}
i++;
tag = 0;
}//将原数组中无重复元素选出;
/***************************************** 选择排序 ***********************************************/
// for(int n=0;n<j;n++){
// min = n;
// for(int m=n;m<j;m++){if(comp[m]<comp[min]) min=m;}//标记到最小元素m
// temp = comp[n];
// comp[n] = comp[min];
// comp[min] = temp;
// }//1.简单选择排序:时间复杂度:O(n^2);空间复杂度O(1);不稳定;
// for(int t =0;t<j;t++){
printf("%c",comp[t]);
}//输出
//小根堆为例:
// for(int k=j;k>0;k--){
// comp[k] = comp[k-1];
// }//将数组从0开始排列变为从1开始;
// for(int t=0;t<j;t++){
// for(int n=(j-t)/2;n>0;n--){
// if((j-t)%2!=0){
// if(comp[2*n]<comp[2*n+1]){
// if(comp[2*n]<comp[n]){
// temp = comp[2*n];
// comp[2*n] = comp[n];
// comp[n] = temp;
// }//如果左子树大于根节点,对左子树与根节点进行互换;
// }//左子树比右字树小
// else{
// if(comp[2*n+1]<comp[n]){
// temp = comp[2*n+1];
// comp[2*n+1] = comp[n];
// comp[n] = temp;
// }//如果右子树大于根节点,对右子树与根节点进行互换;
// }//右子树比左子树小
// }
// else{
// if(comp[2*n]<comp[n]){
// temp = comp[2*n];
// comp[2*n] = comp[n];
// comp[n] = temp;
// }
// }
// }//初始化一趟堆,调整耗时间复杂度O(h);
// printf("%c",comp[1]);//输出最小元素(栈顶元素)
// comp[1] = comp[j-t];//将最后一个元素赋值给栈顶
// comp[j-t] = '\0';//
// }//2.堆排序:时间复杂度O(n*log2n);空间复杂度O(1);不稳定;
/***************************************** 选择排序 ***********************************************/
}
关于交换排序与插入排序后续有时间会进行补充~
以上代码本菜鸡拙见,欢迎大佬们批评教育~堆排序没按书上写,有一些复杂,,奥利给