Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1591414
  • 博文数量: 441
  • 博客积分: 20087
  • 博客等级: 上将
  • 技术积分: 3562
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-19 15:35
文章分类

全部博文(441)

文章存档

2014年(1)

2012年(1)

2011年(8)

2010年(16)

2009年(15)

2008年(152)

2007年(178)

2006年(70)

分类: C/C++

2007-01-31 11:45:52

选择排序算法描述:
从未被排序的整数中找出最小的整数,将其放在已排序整数列表中的下一个位置。

实现思想:
将所有要排序的数放在一个数组a[NUM]中, NUM为要排序的整数的个数,
取出第i ( i >= 0 && i < NUM )个整数和剩下的整数(a[i+1], a[i+2],...,a[NUM-1])进行比较,
把小于a[i]的整数和a[i]进行位置调换,直到所有比较完成。这里面有两层循环,第一层取第0到NUM-1个整数,第二层将第a[i]个整数和剩下的未排序的整数进行比较交换。
举个简单的例子,有3个整数2, 3 ,1
首先从未被排序的整数中取出最小的一个放在已经排序好的整数列表中的下一个位置
目前未被排序的整数是3个: 2, 3, 1
排序好的列表为空
首先取出第一个整数2和剩下的整数3, 1比较
比较过程如下:
第一轮比较 (取第一个整数2)
2, 3 ,1 (比较前)
2, 3, 1 (2和3比较,2<3不用交换位置)
1, 3, 2 (2和1比较,2>1交换2和1的位置)
第二轮比较 (取第二个整数3)
1, 3, 2 (比较前)
1, 2, 3 (3和2比较, 3>2交换位置)
比较完毕,已经排序好了。
假设把排序好的和未排序的整数都放到一个数组中,用|作为分割,|之前为排序好的,之后为未排序的
排序过程如下:
    x[0]    x[1]    x[2]    // 数组x存放所有的排序好的和未排序的整
   |  2      3       1      // 都没有排序,原始数据
      2    | 3       1      //
      1    | 3       2
    
      1      3     | 2
      1      2     | 3
      1      2       3 |

具体的实现过程如下:
/*
    File Name : SelSort.c
    Fuction : 选择排序
    Description :
    从未被排序的整数中找出最小的整数,将其放在已排序整数列表中的下一个位置
*/

#include

#define NUM        10  //要排序的整数的个数

void SelSort(int x[], int num);

int main(void)
{
    int a[NUM]; //存放被排序的整数

    int i;
    printf("Please input %d integers: \n", NUM);
    for ( i = 0; i < NUM; i++ )
        scanf("%d", &a[i]);

    printf("\n\nThe %d numbers you input is:\n", NUM);

    for ( i = 0; i < NUM; i++ )
    {
        printf("%3d", a[i]);
    }
    printf("\n\nSort Result:\n\n");

    SelSort(a, NUM);

    for ( i = 0; i < NUM; i++ )
    {
        printf("%3d\t", a[i]);
    }
    printf("\n");
}

void SelSort(int x[], int num)
{
    int i, j, k;
    int temp;

    // 取出第i个整数,本来应该到num-1,但经过最后一轮交换之后肯定是已经排序好的了,
    // 所以不用再比较了
    for ( i = 0; i < num - 1; i++ ) // i >=0 && i <= num-2
    {
        // 用当前的第i个整数和剩下的整数(从x[i+1]到x[num-1])进行比较
        // 如果第i个整数大于当前比较的整数,则进行交换
        // 也就是将从x[i+1]到x[num-1]的整数中取出最小的那个整数放到x[i]这个位置上
        for ( j = i + 1; j < num ; j++ )
        {
            if ( x[i] > x[j] )
            {
                temp = x[i];
                x[i] = x[j];
                x[j] = temp;
            }
        }
        for ( k = 0; k < num; k++ )
            printf("%3d", x[k]);
        printf("\n");
    }
}

阅读(1689) | 评论(0) | 转发(0) |
0

上一篇:选择排序算法

下一篇:折半查找

给主人留下些什么吧!~~