拜读了太阳落雨兄的排序算法文章,受益良多,本文是在他的选择排序一文基础上加上个人理解和算法分析增强。
一、算法描述
选择排序:首先,选出数组中最小的元素,将它与数组中第一个元素进行交换。然后找出次小的元素,并将它与数组中第二个元素进行交换。按照这种方法一直进行下去,直到整个数组排完序。
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.youkuaiyun.com/cjf_iceking/article/details/7914554