排序算法(三):简单选择排序(Simple Selection Sort)

版权声明:转载请声明 https://blog.csdn.net/qq_40732350/article/details/84521656

基本思想:

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

简单选择排序的示例:

操作方法:

第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;

第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;

以此类推.....

第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,

直到整个序列按关键码有序。

算法实现:

#include <stdio.h>
#include <iostream>
using namespace std;

void print(int a[],int i)
{  
    cout<<i <<" : ";  
    for(int j= 0; j<8; j++)
    {  
        cout<<a[j] <<" ";  
    }  
    cout<<endl;  
}  
  
void selection_sort (int a[], int n)
{
    int i,j,pos,tmp;
    for (i=0; i<n-1; i++)
	{
        //寻找最小值的下标
        for (pos=i, j=i+1; j<n; j++)
            if (a[pos]>a[j])
                pos=j;
        if (pos != i) {
            tmp=a[i];
            a[i]=a[pos];
            a[pos]=tmp;
        }
		print(a, i);
    }
}
 
int main(){  
    int a[8] = {3,1,5,7,2,4,8,6};
    selection_sort(a,8); 
    return 0;
} 

运行结果:

0 : 1 3 5 7 2 4 8 6 
1 : 1 2 5 7 3 4 8 6 
2 : 1 2 3 7 5 4 8 6 
3 : 1 2 3 4 5 7 8 6 
4 : 1 2 3 4 5 7 8 6 
5 : 1 2 3 4 5 6 8 7 
6 : 1 2 3 4 5 6 7 8

算法优化(一):最大值和最小值同时查找

#include <stdio.h>
#include <iostream>
using namespace std;

void print(int a[],int i)
{  
    cout<<i <<" : ";  
    for(int j= 0; j<8; j++)
    {  
        cout<<a[j] <<" ";  
    }  
    cout<<endl;  
}  
  
void selection_sort (int a[], int n)
{
    int i,j,max, min,tmp;
    for (i=0; i<n/2; i++)
    {
        //寻找最小值的下标
            min = i;
            max = n - i - 1;
            for (j = i+1; j < n - i; j++)
            {
                if (a[max] < a[j]){
                    max = j;
                    continue;
                }
                			
                if (a[min] > a[j])
                    min = j;		
		}

            if (max != n - i - 1) {
                tmp = a[n - i - 1];
                a[n - i - 1] = a[max];
                a[max] = tmp;
            }
		
            if (min != i) {
                tmp = a[i];
                a[i] = a[min];
                a[min] = tmp;
            }
            printf("max = %d, min = %d\n", max, min);
            print(a, i);
    }
}
 
int main(){  
    int a[8] = {3,1,5,7,2,4,8,6};
    selection_sort(a,8);
    return 0;
} 

运行结果:

max = 6, min = 1
0 : 1 3 5 7 2 4 6 8 
max = 3, min = 4
1 : 1 2 5 6 3 4 7 8 
max = 3, min = 4
2 : 1 2 3 4 5 6 7 8 
max = 4, min = 3
3 : 1 2 3 4 5 6 7 8

猜你喜欢

转载自blog.csdn.net/qq_40732350/article/details/84521656