您的位置:首页 > 其它

OJ 系列之整数排序

2016-01-25 19:17 323 查看

1、问题描述

实现输入一组大于等于0的整数,

根据从小到大的顺序排序后输出,排序后有连续数时,

只输出连续数中最小和最大的两个数。

一组大于等于0的整数,不考虑非法输入,各个整数之间以逗号(“,”)分隔,

输入字符串的总长度小于等于100个字节。

排序后的值,各个整数之间以空格分隔。

2、解题思路

1、首先从输入字符串inputStr按规律取出数字,然后存储到一个数组中(大小为50,初始值全部为0);

2、对数字进行冒泡法排序

3、排序之后去掉连续的数字,留下连续数字首尾,用后面数覆盖舍去的数字。

3、代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void sort(int a[],int N)
{
/*冒泡法*/
for(int i=0;i<N;i++) {
for(int j=1;j<N;j++) {
int temp;
/*交换*/
if(a[j-1]>a[j]) {
temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
}
}
}
}

void move(int a[],int curPos,int ContiIndex)
{
/*后面的覆盖前面的数*/
while(a[curPos+ContiIndex]!=-1) {
a[curPos+1]=a[curPos+ContiIndex];
curPos++;
}
a[curPos+1]=-1;
}

void SortForIngter(char *inputStr)
{
if(!inputStr)
return;
/*考虑到字符串中有','因此数字长度不会大于50*/
int a[50];
int i = 0,index =0;
/*1.用于存储字符串中整数*/
for(int i=0;i<50;i++) {
a[i]=-1;
}
int inputStrlen = strlen(inputStr);
int temp = 0;
/*不考虑非法输入*/
for(i = 0;i<=inputStrlen;i++) {
if(inputStr[i]==','||i==inputStrlen) {
a[index] = temp;
index ++;
temp = 0;
} else {
temp = temp*10 + inputStr[i]-'0';
}
}
/*2.排序*/
sort(a,index);
/*3.去连续,留首尾*/
int curPos = 0;
int j = 0;
int ContiIndex = 0;
while (a[curPos] != -1 && a[curPos+2] != -1) {
j=curPos;
ContiIndex=0;
while(a[j] != -1 && a[j+1] != -1) {
if(a[j+1] == a[j]+1) {
ContiIndex ++;
j++;
} else {
break;
}
}
if(ContiIndex>=2) {
move(a,curPos,ContiIndex);
}

curPos++;
}
i = 0;
while(a[i] != -1) {
printf("%d ",a[i]);
i ++;
}
printf("\n");
}
int main()
{
char inputStr[101];
gets(inputStr);
SortForIngter(inputStr);
//  getchar();
//  getchar();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  整数排序 OJ