排序算法作为最基本也是最常用的算法,是我们必须要掌握的内容。
本文从比较基础的选择排序算法开始,进行排序算法的介绍。
思想
选择排序,顾名思义,就是从一组总数为n的无序数组中,进行一次遍历,选择出最小(最大)的一个,把它交换到数组的第0个位置。然后不断重复该操作,直到最后两个数。
在第 i 次选择开始时,当前分为有序区 R1 [ 0 .. i -1] 和无序区R2 [ i ... n]。从位置 [ i ] 开始,到数组末尾为止,选择出最小(最大)的一个,把它交换到数组的第[ i ]个位置。
交换之后,有序区R1变为 [ 0 .. i ],无序区R2变为[i + 1 .. n]。即索引位置向后移一位。
代码
#include <iostream>
#define SIZE 10
using namespace std;
int main()
{
int numArray[SIZE] = {5,2,9,6,1,8,10,3,4,7};
for(int i=0; i<SIZE-1; i++)
{
int minNum = numArray[i];
int temp = 0;
int index = i;
for(int j=i+1; j<SIZE; j++)
{
if(numArray[j] < minNum)
{
minNum = numArray[j];
index = j;
}
}
temp = numArray[i];
numArray[i] = numArray[index];
numArray[index] = temp;
}
for(int m=0; m<SIZE; m++)
{
cout << numArray[m] << " ";
}
return 0;
}
分析
由于只剩下两个数的时候,就已经比较出了大小,并依照排序方式进行了交换。所以当把倒数第二个数比较完之后,就已经得到了最终的结果,没有必要把 i 加到数组的最后一位。在代码中体现的就是i < SIZE -1。
由于总的比较次数 N = (n -1) + (n -2) + ... + 1 = n * (n -1) /2 , 所以时间复杂度是O( n ^ 2 )。