| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1593 人关注过本帖
标题:求助一个排序函数!
只看楼主 加入收藏
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
char a[][6]={"abcd","abcce","abf","abccd"};
qsort(char* a);//这个时候T就是char*了

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-08-21 12:38
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
以下是引用wfpb在2006-8-21 12:38:12的发言:
char a[][6]={"abcd","abcce","abf","abccd"};
qsort(char* a);//这个时候T就是char*了

字符串比大小不是比长度而是把字母一个一个比的,要换成比长度你得自己指定是比长度才行。


http://myajax95./
2006-08-21 13:37
lixang
Rank: 1
等 级:新手上路
帖 子:231
专家分:0
注 册:2006-7-15
收藏
得分:0 

对 例如god, dog, good ,goods, best , dest, bet ,beast, cast排序(字母长的排最排后))

排序后应该是这样的:
bet ,dog, god, best ,cast, dest, beast, goods.

2006-08-21 17:35
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
加个函数就可以了吧?是吗?
bool operator>(char* s1,char* s2)
{
    return (strlen(s1)>strlen(s2))
        ||(strlen(s1)==strlen(s2)&&strcmp(s1,s2)>0);
}

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-08-22 12:28
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
差不多吧,你那个SetSmallest我没看明白逻辑,好像不需要第二个参数,另外如果有重复数的时候是否对不太看得明白,另外就是效率问题,是N^2。

http://myajax95./
2006-08-22 14:20
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
myajax95,呵呵,我只会一种排序方法,其他的什么我都没看。
第2个参数其实就是返回值,只是这样可以不用返回,把值写进去

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-08-22 14:26
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
我找本算法书去查查qsort怎么写的。

http://myajax95./
2006-08-22 14:31
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 

写了个比较土的,怎么用template default function object给忘了,回头再写一个好点的。

程序代码:

#include <iostream>
#include <algorithm>
using namespace std;

template<class T>
void quicksort(T* tStart, T* tEnd)
{
T* tPivot;

if (tStart < tEnd)
{
tPivot = partition(tStart, tEnd);
quicksort(tStart, tPivot);
quicksort(tPivot+1, tEnd);
}
}

template<class T>
T* partition(T* tStart, T* tEnd)
{
T tX = *tStart, *tLeft = tStart, *tRight = tEnd;
while (1)
{
while (!(*tRight < tX || tRight == tLeft))
tRight --;
while (*tLeft < tX && tLeft != tRight)
tLeft ++;

if (tLeft < tRight)
swap(*tLeft, *tRight);
else
return tRight;
}
}

struct str
{
public:
str(char *p) : p_str(p) {}
operator < (str s) {return strlen(p_str) < strlen(s.p_str);}
char * p_str;
};

int main()
{
int intAr[] = {11,13,8,19,-21,32};
quicksort(&intAr[0], &intAr[5]);
for (int i = 0; i < 6; i++)
cout << intAr[i] << endl;

float fAr[] = {11.2,14.1, -32.254,3.14159265,-2.182818281828,-2.182818281829,35.000};
quicksort(&fAr[0], &fAr[6]);
for (i = 0; i < 7; i++)
cout << fAr[i] << endl;

str chr[] = {\"god\", \"dog\", \"good\" ,\"goods\", \"best\", \"dest\", \"bet\", \"beast\", \"cast\"};
quicksort<str>(&chr[0], &chr[8]);
for (i = 0; i < 9; i++)
cout << chr[i].p_str << endl;

return 0;
}


http://myajax95./
2006-08-23 15:44
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
用的你的算法,看看还可以吧

[CODE]#include <iostream>
#include <algorithm>
using namespace std;


template<class T> struct less_t
{
bool operator()(T t1, T t2) { return t1 < t2; }
};

struct less_str
{
bool operator()(const char *p, const char*q) { return strcmp(p,q)<0; }
};


template<class T>
void quicksort(T* tStart, T* tEnd) // overloading
{
quicksort(tStart, tEnd, less_t<T>());
}

template<class T,class Comp>
void quicksort(T* tStart, T* tEnd, Comp comp)
{
T* tPivot;

if (tStart < tEnd)
{
tPivot = partition(tStart, tEnd, comp);
quicksort(tStart, tPivot, comp);
quicksort(tPivot+1, tEnd, comp);
}
}

template<class T, class Comp>
T* partition(T* tStart, T* tEnd, Comp comp)
{
T tX = *tStart, *tLeft = tStart, *tRight = tEnd;
while (1)
{
while (!(comp(*tRight, tX) || tRight == tLeft))
tRight --;
while (comp(*tLeft, tX )&& tLeft != tRight)
tLeft ++;

if (tLeft < tRight)
swap(*tLeft, *tRight);
else
return tRight;
}
}

int main()
{
int intAr[] = {11,13,8,19,-21,32};
quicksort(&intAr[0], &intAr[5]);
for (int i = 0; i < 6; i++)
cout << intAr[i] << endl;

float fAr[] = {11.2,14.1, -32.254,3.14159265,-2.182818281828,-2.182818281829,35.000};
quicksort(&fAr[0], &fAr[6]);
for (int i = 0; i < 7; i++)
cout << fAr[i] << endl;

char *chr[] = {"god", "dog", "good" ,"goods", "best", "dest", "bet", "beast", "cast"};
quicksort(&chr[0], &chr[8], less_str());
for (int i = 0; i < 9; i++)
cout << chr[i] << endl;
cin.get();
return 0;
}[/CODE]

2006-08-23 19:13
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
头文件应该加 <cstring>
不过不加好象也行?

2006-08-23 19:15
快速回复:求助一个排序函数!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037458 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved