C语言数组排序问题 10

入一组整数,对前半部分的数从大到小排序,对后半部分的数从小到大排序。例如:输入的是:1234567891020191817161514131211,则按指定规则排序后的结... 入一组整数,对前半部分的数从大到小排序,对后半部分的数从小到大排序。
例如:
输入的是:1 2 3 4 5 6 7 8 9 10 20 19 18 17 16 15 14 13 12 11,
则按指定规则排序后的结果是:10 9 8 7 6 5 4 3 2 1 11 12 13 14 15 16 17 18 19 20

若输入的是:1 2 3 4 5 4 3 2 1,则按指定规则排序后的结果是:4 3 2 1 5 1 2 3 4
展开
 我来答
kwydwuf
2009-05-07 · TA获得超过7411个赞
知道大有可为答主
回答量:1527
采纳率:71%
帮助的人:2016万
展开全部
搞定, 用户手动输入数列,可以是正负数。宏定义 MAX_STRING_SIZE 决定用户输入的最大字符长度, MAX_ARRAY_SIZE决定用户最多输入的整数个数。

bubble_sort() 函数实现冒泡法排序, 第一个参数为被排序数组,第二个参数为数组长度,地三个参数为排序方式, 0 表示从小到大,非0表示从大到小。

/* vim: set et sw=4: */
#include <stdio.h>
#include <string.h>

#define MAX_STRING_SIZE (4096)
#define MAX_ARRAY_SIZE (100)

#define COMPARE(a, b, comp_type) (comp_type == 0 ? (a > b) : (a < b))

/* sort_type = 0, small to large, else in reverse order */
void bubble_sort(int * ar, int size, int sort_type)
{
int swapped, i, val;
do
{
swapped = 0;
for(i = 0; i < size - 1; i++)
{
if(COMPARE(ar[i], ar[i+1], sort_type))
{
val = ar[i];
ar[i] = ar[i+1];
ar[i+1] = val;
swapped++;
}
}
size--;
} while(swapped != 0);
}

int main()
{
char buffer[MAX_STRING_SIZE];
char * p;
int array[MAX_ARRAY_SIZE];
int i, len, num_count;
char ch;

printf("Input number serials, seperated by white spaces!\n");
len = num_count = 0;
while(((ch = getchar()) != '\n') && len < MAX_STRING_SIZE)
{
if(ch >= '0' && ch <= '9')
{
buffer[len++] = ch;
}
else
{
switch(ch)
{
case ' ':
buffer[len++] = '\0';
break;
case '-':
case '+':
buffer[len++] = ch;
break;
default:
printf("\nInvalid character!\n");
return -1;
}

}
}
buffer[len] = '\0';

for(i = 0; i < len; i += (strlen(p)+1))
{
p = &buffer[i];
if(*p != '\0')
{
if(num_count >= MAX_ARRAY_SIZE)
{
printf("array is full (total %d elements), remaining numbers are discarded!\n", num_count);
break;
}
array[num_count++] = atoi(p);
}
}

if(num_count > 1)
{
/* sort first half by reverse order */
bubble_sort(array, num_count/2, 1);
/* sort last part */
if(num_count % 2)
{
bubble_sort(&array[num_count/2 + 1], num_count/2, 0);
}
else
{
bubble_sort(&array[num_count/2], num_count/2, 0);
}
}

printf("After sorting:\n");
for(i = 0; i < num_count; i++)
{
printf("%d ", array[i]);
}
printf("\n");

return 0;
}
dunkuenfai
2009-05-06 · TA获得超过105个赞
知道答主
回答量:191
采纳率:0%
帮助的人:74.2万
展开全部
正在学java,看到你的问题就用java写了一次,学过c的应该能看得懂吧
public class win {
public static void main(String[] args ) {
int a[]={1,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10, 20 ,19, 18 ,17 ,16, 15 ,14 ,13, 12 ,11};
//int a[]={1 ,2, 3 ,4 ,5 ,4 ,3 ,2 ,1};
int len=a.length;
int temp;
System.out.print("排列前:");//打印排列前数据
for(int m=0;m<len;m++){
System.out.print(a[m]);
System.out.print(" ,");
}
for (int i=0;i<len;i++){
for (int j=1;j<len;j++){
if (j<len/2){
if(a[j]>a[j-1]){
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}else{
if(a[j]<a[j-1]){
temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}

}
}
System.out.print("\n排列后:");//打印排列后数据
for (int k=0;k<len;k++){
System.out.print(a[k]);
System.out.print(" ,");
}
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
fulwee
2009-05-06 · TA获得超过3603个赞
知道大有可为答主
回答量:3697
采纳率:100%
帮助的人:3530万
展开全部
关键是长度问题,如果长度未知的话,输入时最好当做字符串,然后用strlen计算长度,然后用冒泡法,通过比较ASCii码 实现从大到小和从小到大的排序,这个人和c书上都有的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
oke00
2009-05-06
知道答主
回答量:33
采纳率:0%
帮助的人:0
展开全部
关注中
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
柴夏出昭
2019-12-27 · TA获得超过3.6万个赞
知道大有可为答主
回答量:1.2万
采纳率:30%
帮助的人:1082万
展开全部
一组(小到大)排序数字和一组(小到大)排序数字归并一组的话,首先以一组为基础,另一组的第一个数字和基础排序的组的中间数字比较,大的话向右移动,小的话相左移动,每次都是和中间的比较,
例如1组(1,3,5,6,7,8,9)2组(2,5,10,23,24,69)先把2组2和1组5比较,小的话向左移动,继续和1组3比较,小的话继续最后找到位置追加,2组5同上,最后都追加完成了,从后面输出就可以了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式