简单选择排序

简单选择排序算法只需要一个辅助空间用于交换记录,所以,简单选择排序算法是一种稳定的排序方法。
【例】关键码序列为(42,20,17,27,13,8,17,48),用简单选择排序算法进行排序。
排序过程如图所示。

简单选择排序算法

选择排序的基本思想是每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列的第i个记录。我们这里先介绍的是简单选择排序法。
        简单选择排序法(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n)个记录交换之。

从简单选择排序的过程来看,它最大的特点就是交换移动数据次数相当少,这样也就节约了相应的时间。分析它的时间复杂度发现,无论最好最差的情况,其比较次数都是一样的多,第i趟排序需要进行ni次关键字的比较,此时需要比较 次。而对于交换次数而言,当最好的时候,交换为0次,最差的时候,也就初始降序时,交换次数为n-1次,基于最终的排序时间是比较与交换的次数总和,因此,总的时间复杂度依然为O(n2)。
应该说,尽管与冒泡排序同为O(n2),但简单选择排序的性能上还是要略优于冒泡排序。

代码如下:

#include <iostream>
#include <time.h>
using namespace std;
 
//交换两个数据
void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
 
 
//显示交换后的数组
void display_array( int a[], int n )
{
    int i;
    for( i = 0; i < n; i++ )
        cout << a[i] << " ";
}
 
 
 
//选择排序
void select_sort( int a[], int n )
{
 
    int i ,j;
     
    for(i = 0; i < n - 1 ; i++ )    
    {                                  
        int min = a[i];     //每次都设定最小的数min
        for(j = i+1; j <n; j++)  // 将a[i]- a[9]的数于当前最小的数进行比较,如果小于当前最小数就交换
        {
            if(a[j] < min)
            {   
                swap(&(a[j]), &(a[i]));
            }
        }
		select_sort(a, i);
    }
}
 
 
int main()
{
    clock_t start, finish;
    start = clock();
 
    int  n = 8;
    int a[] = {42, 20, 17, 27, 13 ,8, 17, 48};
    cout << "数据排序前: ";
    display_array( a, n );
    cout << endl;
 
    select_sort( a, n );
    cout << "数据排序后: ";
    display_array( a, n );
    finish = clock();
    cout << endl;
	cout<<"本次计算一共耗时:"<< (float)(finish-start)/1000 << "秒";
	getchar();
	getchar();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值