选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R[i..n](1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[1..i]和R[i+1..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
算法分析:直接选择排序是不稳定的排序,而且是就地排序,无论文件初始状态如何,在第i趟排序中选出最小关键字的记录,需做n-i次比较,因此,总的比较次数为:n(n-1)/2=0(n2)
代码如下:
/***********************************************
直接选择排序算法
shell_sort.cpp
Created by Summer_ZJU
2014.07.12
Copyright (c) 2014 ZJU.All rights reserved.
************************************************/
#include <iostream>
using namespace std;
void select_sort(int a[],int len)
{
int i,j,k;
int n=len;
for (i=0;i<n-1;i++)//n 个数要选 n-1 趟
{
k=i;//假设当前趟的第一个值为最值
for (j=i+1;j<=n;j++)//从下一个到最后一个数之间寻找最值
{
if(a[j]>a[k])
k=j; //找到更大的,记录下标
}
if(k!=i) //若k 不是当初的那个,说明后面有更小的值,交换之
swap(a[k],a[i]);
}
}
int main()
{
int arr[100]={0};
int n;
cout<<"输入数的个数:";
cin>>n;
cout<<endl<<"原始数据输入:"<<endl;
for(int i=0;i<n;i++)
cin>>arr[i];
cout<<endl<<"排序后输出数据:"<<endl;
select_sort(arr,n);
for (int k=0;k<n;k++)
cout<<arr[k]<<" ";
cout<<endl;
system("pause");
return 0;
}