数据结构基础1Swapamp

Swap的简单实现

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片

//C语言方式(by-pointer):

templatetypenameType

boolswapByPointer(Type*pointer1,Type*pointer2)

{

//确保两个指针不会指向同一个对象

if(pointer1==NULL

pointer2==NULL)

{

returnfalse;

}

if(pointer1!=pointer2)

{

Typetmp=*pointer1;

*pointer1=*pointer2;

*pointer2=tmp;

}

returntrue;

}

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片

//C++特有方式(by-reference):

templatetypenameType

voidswapByReference(Typevalue1,Typevalue2)

{

if(value2!=value1)

{

Typetmp=value1;

value1=value2;

value2=tmp;

}

}

小结:

  虽然我们自己实现了swap,但我们还是比较推荐使用C++STL已经实现好的std::swap()函数,其存在于命名空间std中,使用实例如下面的冒泡排序.

冒泡排序(Bubble-Sort)

算法思想:

  从左到右扫描数据,找出最大的元素,将其放到数组右边;

过程:

  循环比较相邻的两个数,如果左边的数比右边的大,则交换两个数;

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片

//实现:注意代码中的三个注意点(x):

templatetypenameType

voidbubbleSort(Type*begin,Type*end)

{

if((begin==end)

(begin==NULL)

(end==NULL))

return;

intlength=end-begin;

//注意点(1):保证一旦数组有序,则会直接停止排序,不会在继续进行无用的循环

boolisOrder=false;

//外层循环控制扫描次数(length-1)

//注意点(2):N个元素其实只需N-1次扫描

for(inti=0;!isOrderilength-1;++i)

{

//首先假定这次数组已经有序

isOrder=true;

//注意点(3):确保能够从0扫描到最后一个未排序的元素

for(Type*iter=begin;iterend-i-1;++iter)

{

//如果前面的左边的元素右边的元素

if(*iter*(iter+1))

{

//交换

std::swap(*iter,*(iter+1));

isOrder=false;

}

}

}

}

templatetypenameType

voidbubbleSort(Type*array,intlength)

{

returnbubbleSort(array,array+length);

}

选择排序(Select-Sort)

思想:

  从当前尚未排序的序列中选择一个最小的元素,将之放到已排序的序列的队列的末尾;

要点:

  1.注意三个指针(inner,outer,miner)所代表的含义;

  2.同时注意是从未排序的序列中进行查找最小元素!

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片

//实现

templatetypenameType

voidselectSort(Type*begin,Type*end)

{

if((begin==end)

(begin==NULL)

(end==NULL))

return;

//只要循环到最后一个元素的前一个就行了,因为剩下的那个肯定是最大的

for(Type*outer=begin;outerend-1;++outer)

{

//注意:是从尚未排序的序列中查找(miner=outer,inner=outer+1)

Type*miner=outer;

//从miner+1开始遍历数组,寻找一个元素值小于*miner的

for(Type*inner=outer+1;innerend;++inner)

{

if(*inner*miner)

miner=inner;

}

if(miner!=outer)

std::swap(*miner,*outer);

}

}

//为了能够让STL的标准容器如vector使用

templatetypenameIterator

voidselectSort(Iteratoriter1,Iteratoriter2)

{

returnselectSort((*iter1),(*iter2));

}

templatetypenameType

voidselectSort(Type*array,intlength)

{

returnselectSort(array,array+length);

}

小结:

  虽然我们自己实现了Bubble-Sort和Select-Sort,但我们在实际软件开发中一般是不会用到的,因为的它的效率为O(N^2),效率太慢^_^,因此我们还是推荐使用C++STL中已经实现了的std::sort(),其内部原理使用了快速排序,效率为O(logN)速度非常快.

附-测试程序

[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片

intmain()

{

srand(time(NULL));

vectordoubledVec;

intcount=10;

while(count--)

{

dVec.push_back((rand()%)/.0);

}

selectSort(dVec.begin(),dVec.end());

for(vectordouble::iteratoriter=dVec.begin();iterdVec.end();++iter)

{

cout*iterendl;

}

return0;

}

赞赏









































哪里白癜风能治好
最好白癜风医院电话



转载请注明:http://www.92nongye.com/xxmb/204618436.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了