首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

巨丑的一段冒泡排序,前辈们给点意见,该如何修改

2013-12-05 
巨丑的一段冒泡排序,前辈们给点意见,该怎么修改。本帖最后由 guangzhanzb 于 2013-11-25 16:50:08 编辑void

巨丑的一段冒泡排序,前辈们给点意见,该怎么修改。
本帖最后由 guangzhanzb 于 2013-11-25 16:50:08 编辑


void CODAngleLine::bubbleSort(std::vector<CPoint>& orderless, BOOL byX, BOOL bigTail)
{
BOOL hadSort = FALSE;
for(int i=0; i<orderless.size(); i++){
for(int j = 0; j < orderless.size()-i-1; j++){
if(byX){
if(bigTail){
if((orderless)[j].x > orderless[j+1].x){
hadSort = TRUE;
CPoint tmp = orderless[j];
orderless[j] = orderless[j+1];
orderless[j+1] = tmp;
}
}else
{
if((orderless)[j].x < orderless[j+1].x){
hadSort = TRUE;
CPoint tmp = orderless[j];
orderless[j] = orderless[j+1];
orderless[j+1] = tmp;
}
}
}else{
if(bigTail)
{
if((orderless)[j].y > orderless[j+1].y){
hadSort = TRUE;
CPoint tmp = orderless[j];
orderless[j] = orderless[j+1];
orderless[j+1] = tmp;
}
}else
{
if((orderless)[j].y < orderless[j+1].y){
hadSort = TRUE;
CPoint tmp = orderless[j];
orderless[j] = orderless[j+1];
orderless[j+1] = tmp;
}
}
}
}
if(!hadSort){
break;
}
}
}

代码是上面那样,中间充斥着大量逻辑相近,重复的代码。我刚学习C++不久,不知道这段代码怎样可以变得更高效,更美观。
我猜测中间重复的if是不是可以用“#ifdef”来选择编译?我都不知道“#ifdef”能不能这么用……
前辈们给点意见吧。主要就是想要实现可以选择性的根据X轴或Y轴坐标从大到小或从小到大排序。
[解决办法]
http://bbs.csdn.net/topics/390529856?page=1#post-396136406
这个帖子..贴出了6种排序的实现,下面很多大牛的回复和讨论..会收益很多
[解决办法]
很高兴回答你的问题。
#include <iostream>
using namespace std;

void BubbleSort(int sortArray[], int length, bool bigTail = true);
void PrintArray(int sortArray[], int length);

int main()
{
int iTestArray[12] = {10, 2, 23, 4, 23, 22, 4, 98, 0, 1, 54, 9};

// 把byX判断移动到这里,因为byX判断是你的业务,业务就不要和算法混合在一起,很容易搞乱的
if (/*byX*/)
{
BubbleSort(iTestArray, 12, false);
}

// 等等
PrintArray(iTestArray, 12);
}

void BubbleSort(int sortArray[], int length, bool bigTail)
{
for (int i = 0; i < length; ++i)
{
for (int j = 0; j < length - i - 1; ++j)
{
if (bigTail)
{
if (sortArray[j] > sortArray[j + 1])
{
int temp = sortArray[j];
sortArray[j] = sortArray[j + 1];
sortArray[j + 1] = temp;
}
}
else
{
if (sortArray[j] <= sortArray[j + 1])
{
int temp = sortArray[j];
sortArray[j] = sortArray[j + 1];
sortArray[j + 1] = temp;
}
}
}
}
}

void PrintArray(int sortArray[], int length)
{
for (int i = 0; i < length; ++i)
{
cout<<sortArray[i]<<" ";
}
cout<<endl;
}

在代码中也注释了,你需要把业务代码和算法进行分离。不要把整个实现都放入到一个函数中去搞。而且你的这种代码就是出现问题了,后期也不好维护,更别说扩展了。

更多原创知识文章,你可以参考我的个人小站:果冻想
[解决办法]
关键点怎么把代码写的好看又清晰,又易于维护呢?

你的byx和bigtail 说白了就是排序规则,所以我们所需要的输入是 序列和序列排序规则

你需要将规则centralize到一起,譬如


bool bubbleSort(List _list, Rule _rule)
{
return _list.BubbleSortByRules(_rule);
}

bool BubbleSort(Rule _rule)
{
for(int i = 0; i < size; ++i)
{
for(int j = 0; j < size-i-1; ++j)
{
if(ShouleSwapByRules(Vec[j], Vec[j+1], _rule))
SWAP(Vec[j], Vec[j+1]);
}
}
}

[解决办法]
typedef int (*point_comparer)(const CPoint& p1, const CPoint& p2);
void bubbleSort(vector<CPoint>& orderless, point_comparer comparer) {


typedef vector<CPoint>::iterator iterator_type;

iterator_type begin = orderless.begin(), //
end = orderless.end(), //
last = end - 1;
for (iterator_type i = begin; i != last; i++) {

for (iterator_type j = i + 1; j != end; j++) {
if (comparer(*i, *j) > 0) {
swap(*i, *j);
}
}
}
}



把point_comparer弄成模板参数也可以(一般情况下应该是更好)

热点排行