排序算法之选择排序

来源:互联网 发布:学校网络环境建设 编辑:程序博客网 时间:2024/05/14 03:02

问题描述:

输入一个原始数列,把它进行升序排序,从小到大输出。

例如:给定数列如下:
5 15 99 45 12 1 90 19 33 41

排序后的结果为:
1 5 12 15 19 33 41 45 90 99

选择排序,就是第一步从所有的数据中选出最小的数放在第一个位置,然后从剩下的数中选出最小的放在第二个位置,以此类推,就能从小到大排好所有的数,下面来看一个具体的过程:

下标值序号: 0 1 2 3 4 5 6 7 8 9
原始状态为: 5 15 99 45 12 1 90 19 33 41
第一趟排序: 1 15 99 45 12 5 90 19 33 41(遍历下标0-9,选出最小的数放在下标为0的位置)
第二趟排序: 1 5 12 99 45 15 90 19 33 41(遍历下标1-9,选出最小的数放在下标为1的位置)
第三趟排序: 1 5 12 15 99 45 90 19 33 41(遍历下标2-9,选出最小的数放在下标为2的位置)
第四趟排序: 1 5 12 15 19 99 90 45 33 41(遍历下标3-9,选出最小的数放在下标为3的位置)
第五趟排序: 1 5 12 15 19 33 99 90 45 41(遍历下标4-9,选出最小的数放在下标为4的位置)
第六趟排序: 1 5 12 15 19 33 99 90 45 41(遍历下标5-9,选出最小的数放在下标为5的位置)
第七趟排序: 1 5 12 15 19 33 41 99 90 45(遍历下标6-9,选出最小的数放在下标为6的位置)
第八趟排序: 1 5 12 15 19 33 41 45 99 90(遍历下标7-9,选出最小的数放在下标为7的位置)
第九趟排序: 1 5 12 15 19 33 41 45 90 99(遍历下标8-9,选出最小的数放在下标为8的位置)

从上面我们可以发现:
1. 对于N个数的数列来说,需要N-1趟才能完全排好
2. 因为每一趟只能选出一个数,并且在选的过程并不能保证后面的数已经有序了
3. 这个算法是一个不稳定的排序算法,因为如果是相同的两个数,他们的相对顺序排序前和排序后会不一样
4. 这个算法的时间复杂度是O(n^2)

参考代码:

#include<stdio.h>int main(){    int arr[] = { 5, 15, 99, 45, 12, 1, 90, 19, 33, 41 };    int i, j, nTemp, nCount = sizeof(arr) / sizeof(arr[0]);    printf("排序前\n");    for (i = 0; i < nCount; i++)        printf("%d ", arr[i]);    printf("\n");    for (i = 0; i < nCount; i++)    {        for (j = i + 1; j < nCount; j++)//遍历i到nCount-1把最小的数放在下标为i的位置        {            if (arr[j] < arr[i])            {                nTemp = arr[j];                arr[j] = arr[i];                arr[i] = nTemp;            }        }    }    printf("\n排序后\n");    for (i = 0; i < nCount; i++)        printf("%d ", arr[i]);    printf("\n");    return 0;}

运行结果:
这里写图片描述

3 0
原创粉丝点击