选择排序

4 篇文章 0 订阅
1 篇文章 0 订阅

拜读了太阳落雨兄的排序算法文章,受益良多,本文是在他的选择排序一文基础上加上个人理解和算法分析增强。

一、算法描述

选择排序:首先,选出数组中最小的元素,将它与数组中第一个元素进行交换。然后找出次小的元素,并将它与数组中第二个元素进行交换。按照这种方法一直进行下去,直到整个数组排完序。


    0   1   2   3   4   5   6   7   8   9
    -------------------------------------
    3   55  1   232 11  6   9   8   1   10  
    selection index:2
    1   55  3   232 11  6   9   8   1   10  
    selection index:8
    1   1   3   232 11  6   9   8   55  10  
    selection index:2
    1   1   3   232 11  6   9   8   55  10  
    selection index:5
    1   1   3   6   11  232 9   8   55  10  
    selection index:7
    1   1   3   6   8   232 9   11  55  10  
    selection index:6
    1   1   3   6   8   9   232 11  55  10  
    selection index:9
    1   1   3   6   8   9   10  11  55  232 
    selection index:7
    1   1   3   6   8   9   10  11  55  232 
    selection index:8
    1   1   3   6   8   9   10  11  55  232 

    done
    1   1   3   6   8   9   10  11  55  232

二、算法分析

平均时间复杂度:O(n2)

空间复杂度:O(1) (用于交换和记录索引)

稳定性:不稳定

三、算法实现

#include <stdlib.h>
#include <stdio.h>

void print(int *pDataArray, int iDataNum);

void DataSwap(int* data1, int* data2)
{
    int temp = *data1;
    *data1 = *data2;
    *data2 = temp;
}

/********************************************************
 * *函数名称:SelectionSort
 * *参数说明:pDataArray 无序数组;
 * *           iDataNum为无序数据个数
 * *说明:    选择排序
 * *********************************************************/
void SelectionSort(int* pDataArray, int iDataNum)
{
    int i=0,j=0;
    for (i = 0; i < iDataNum - 1; i++)    //从第一个位置开始
    {
        int index = i;
        for (j = i + 1; j < iDataNum; j++)    //寻找最小的数据索引 
            if (pDataArray[j] < pDataArray[index])
            {   
                index = j;
                printf("%d,",index);
            }

        if (index != i)    //如果最小数位置变化则交换
            DataSwap(&pDataArray[index], &pDataArray[i]);

        printf("\nselection index:%d",index);
        print(pDataArray, iDataNum);
    }
}

//打印数组
void print(int* pDataArray, int iDataNum)
{
    int i=0;
    printf("\n");
    for(i=0;i<iDataNum;i++)
    {
        printf("%d  ",pDataArray[i]);
    }
    printf("\n");
}

int main(){
    int iDataNum = 10;
    int pDatas[10] = {3,55,1,232,11,6,9,8,1,10};
    printf("init\n");
    print(pDatas, iDataNum);
    SelectionSort(pDatas, iDataNum);
    printf("\ndone\n");
    print(pDatas, iDataNum);
}

参考文章:http://blog.csdn.net/cjf_iceking/article/details/7914554

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值