数据结构与算法之排序算法—简单选择排序
- 简单选择排序的基本思想
- 完整实现代码
- 复杂度分析
2016年10月18日15:54:57 by:piaxiaohui
简单排序的基本思想
简单选择排序:先选择一个关键字,然后进行比较,找到合适的关键字再做交换,并且只移动一次。冒泡排序的思想就是不断地(相邻两个元素)交换,通过交换完成最终的排序。
简单选择排序就是每一趟在n-i+1(i=1,2,….,n-1)个记录中选取关键字最小的记录作为有序序列的第i个记录。
完整代码实现
@requires_authorization
#include <iostream>
using namespace std;
//功能函数:实现数组元素的交换功能
void swap( int a[], int i , int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
//功能函数:实现数组的打印功能
void printArray( int a[],int length){
for( int i = 0; i < length; i++){
cout << a[i] << " ";
}
cout << endl;
}
//核心函数:简单选择排序算法的实现
void SelectSort( int a[], int length){
int min;
for( int i = 0; i < length-1; i++){
min = i;
cout << "第"<<i<<"趟排序后的序列为:"<<endl;
for( int j = i+1; j<=length-1 ; j++){
if( a[min] > a[j]){
min = j;
}
}
//注意这里是在内部for循环结束后才做比较
if( min != i){
swap(a,i,min);
}
printArray(a,length);
}
}
int main(){
int a[10]={1,3,5,7,9,0,2,4,6,8};
int length = 10;
cout<<"数组排序前为:"<<endl;
printArray(a,length);
SelectSort(a,length);
cout <<"数组排序后为:"<<endl;
printArray(a,length);
return 0;
}
运行结果:
时间复杂度分析
简单选择排序最大的优点在于:减少了比较的次数
(1) 无论最好最差的情况,其比较次数都是一样多的:第i趟排序需要n-i次关键字的比较,此时需要比较
(n-1)+(n-2)+(n-3)+…+3+2+1 = n(n-1)/2;
(2)对于交换次数而言,当最好的时候,交换次数为0,最差的时候交换次数为n-1次
因此最终时间复杂度为:O(n2);
(3)尽管与冒泡排序同为O(n2),但简单选择排序的性能上还是要略优于冒泡排序。