打印

shell 按照每行的长度排序

shell 按照每行的长度排序

比如
排序前
aaa
bb
aaaa
a
aaaaa
排序后
a
bb
aaa
aaaa
aaaaa

多谢大虾们了

[ 本帖最后由 ypli 于 2007-12-25 10:42 编辑 ]

TOP

回复 #1 ypli 的帖子

希尔排序(shellsort)又叫增量递减(diminishing increment)排序,是由D.L. Shell发明的,这个算法是通过一个逐渐减小的增量使一个数组逐渐趋近于有序从而达到排序的目的。

假设有一个数组int data[16] = {...}。 首先将这个增量设为16 / 2 = 8, 这样就将这个数组分成了8个子数组,它们的索引是0, 8 1, 9 2, 10等等 。对这些子数组进行排序。然后再使增量为8 / 2 = 4,这样就将原数组分成了4个子数组,它们的索引分别是0, 4, 8, 12 1, 5, 9, 13等等。再对这四组数进行排序,直到增量为1。
以上所描述的增量递减只是一种方法,这种方法并不是最有效率的。如f(n) = 3 * f(n - 1) + 1 f(1) = 1 (..., 121, 40, 13, 4, 1)就比上面的取增量的方法好。这种方法的时间复杂度是O(n ^1.5)。

算法如下

#include <stdio.h>

void output_array(int data[], int n)
{
int i;
for(i = 0; i < n; i++)
printf("%d ", data);
printf("\n");
}
void swap(int *a, int *b)
{
int x;
x = *a;
*a = *b;
*b = x;
}
void insertion_sort(int data[], int n, int increment)
{
int i, j;
for(i = increment; i < n; i += increment)
for(j = i; j >= increment && data[j] > data[j - increment]; j -= increment)
swap(&data[j], &data[j - increment]);
}
void shellsort(int data[], int n)
{
int i, j;
for(i = n / 2; i > 2; i /= 2)
for(j = 0; j < i; j++)
insertion_sort(data + j, n - j, i);
insertion_sort(data, n, 1);
}
int main()
{
int data[] = {5, 3, 1, 665, 77, 66, 44, 11, 10, 9, 8, 6};
output_array(data, 12);
shellsort(data, 12);
output_array(data, 12);
return 0;
}



希望这个能给你点提示
受人予鱼不如受人予技
如果回避只是为自己今后的后悔而找的借口的话,那么我想挣脱掉这个束缚的枷锁——就算遍体鳞伤我也无怨无悔!愛してる,まうぇんりん.ぽくわ大好き!~
清理qq中的长舌妇,以后有什么P话论坛说,qq中扯皮的人一律删除,qq今后不接待一切问候、闲谈等无聊内容。成功为qq瘦身,肩负100人,其中10人拉黑。

TOP

我的意思是可不可以用shell命令完成这样的操作
像sort命令是按照字母来排序的
有没有命令直接按照每一行的长度来排序

TOP


感谢一直以来您对我们的支持!
当前时区 GMT+8, 现在时间是 2008-12-2 00:22 京ICP证060528 号

Designed By 17DST