简单选择排序
在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。
简单选择排序的示例图:
简单选择排序的改进——二元选择排序
简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。
算法实现:
#include <iostream>
using namespace std;
#define N 9
void print(int a[], int n, int i){
cout<<"第"<<i+1 <<"趟 : ";
for(int j= 0; j<n; j++){
cout<<a[j] <<" ";
}
cout<<endl;
}
/**
* 数组的最小值
*
* return int 数组的键值
*/
int select_minKey(int a[], int n, int i)
{
int k = i;
for(int j=i+1 ;j< n; ++j){
if(a[k] > a[j]) k = j;
}
return k;
}
/**
* 选择排序
*
*/
void select_sort(int a[], int n){
int key, tmp;
for(int i = 0; i < n; ++i) {
key = select_minKey(a, n, i);//选择最小的元素
if(key != i){
tmp = a[i]; a[i] = a[key]; a[key] = tmp; //最小元素与第i位置元素互换
}
print(a, n , i);
}
}
void select_sort1(int a[], int n)
{
int i,j,max,min;
int temp = 0; //下标min max 指向最小和最大元素
for (i= 0; i<n/2; i++){ //i跑 n/2趟排序就会排序完成
min = max= i; //先将max和min都指向待排序的第一个元素
for(j= i; j< n-i; j++){
//用j找出最大值和最小值,分别让max 和min指上来
if(a[j]>a[max]){
max = j;
continue;
}
if(a[j]<a[min])
min = j;
}
/*这个时候将最小值放在位置i处,
将最大值放在位置n-i-1处
*/
if (min != i)
{//最小值是否在i位置上,不是先交换
temp = a[i];
a[i] = a[min];
a[min] = temp;
}
if (max == i)//最大值是不是在i位置上,如果在说明经过前次交换最大值已经位于min位置,因此需要修改max
max = min;
if (max != n - i -1)
{//判断最大值是否需要交换
temp = a[n - i -1];
a[n - i -1] = a[max];
a[max] = temp;
}
print(a, n, i);
}
}
int main(){
int a[N] = { 3, 1, 5, 7, 2, 4, 9, 6, 8};
cout<<"初始值:";
for (int j= 0; j < N; j++){
cout<<a[j] <<" ";
}
cout<<endl<<endl;
select_sort(a, N);
//select_sort1(a, N);
}