现在来看一看一种常规的排序算法,选择排序。
本页内容
1.选择排序的原理
2.代码实现
3.在向量模板中实现
4.总体评价
1.选择排序的原理
选择排序是通过重复将未扫描的数列中最大元素选出,使之向后就位,最后将整个数列排为有序为止。可看下图实例:
2.代码实现
#include<iostream>
using namespace std;
void selectionSort(int *A,int lo,int hi)
{
int temp;//中间交换元素
int sL=hi;//扫面长度
for(int i=lo;i<hi;i++)//
{
int max=lo;//最大值下标
for(int j=lo;j<sL;j++)
{
if(A[max]<A[j])
{
max=j;
}
}
sL--;//每扫面一次,搜索区间减少1位
//交换,使扫描区间中最大元素就位
temp=A[max];
A[max]=A[sL];
A[sL]=temp;
}
}
int main()
{
/***********测试*********/
int a[10];
cout<<"测试数组为:";
for(int i=0;i<10;i++)
{
a[i]=9-i;
cout<<a[i]<<" ";
}
cout<<endl;
selectionSort(a,0,10);
cout<<"selectionSort后:";
for(int i=0;i<10;i++)
{
cout<<a[i]<<" ";
}
/***********************/
return 0;
}
运行结果:
3.在向量模板中实现
template<typename T>
void myVector<T>::selectionSort(Rank lo,Rank hi)
{
Rank sL=hi;//扫面长度
for(Rank i=lo;i<hi;i++)//
{
Rank max=lo;//最大值下标
for(Rank j=lo;j<sL;j++)
{
if(_elem[max]<_elem[j])
{
max=j;
}
}
sL--;//每扫面一次,搜索区间减少1位
swap(_elem[max],_elem[sL]);//交换,使扫描区间中最大元素就位
}
}
4.总体评价
选择排序的复杂度虽然为O(n^2),但它却比起泡排序要好不少。起泡排序可以说是一种特殊的选择排序,但其交换的次数实在是太多了(相邻两个元素一逆序就换)。而向上述的这种选择排序的算法每次扫面只交换一次( swap(_elem[max],_elem[sL]) ),这就是它比起泡排序效率高的地方。