void StraightSelectionSort(int array[], unsigned int n) { /* 注:关键字值类型为int,数组的索引是从0开始 1. 初始状态无序区为array【0, n - 1】,有序区为空。 2. 第1趟排序从array【0, n - 1】中找到下标为k的关键字最小值,把array【k】和 array【0】交换。现在无序区为array【1, n - 1】, 有序区为array【0, 0】。 第2趟排序... 第3趟排序... ... 3. 第i趟排序(1 <= i <= n - 1),从array【i, n - 1】中找到下标为j的关键字最小值,把 array【j】和array【i - 1】交换,如果i == n - 1,则排序结束,否则继续3步骤。 */ /* 总共需要n - 1次排序,从1到n - 1 */ for (int i = 1; i <= n - 1; i++) { /* k值从0到n - 2, 最后一个记录关键字值必定是最大的 */ int k = i - 1; int swap = 0; /* 这个for循环找到第i趟排序中无序区关键字值最小记录的下标 */ for (int j = i; j < n; j++) { if (array[j] < array[k]) { k = j; } } /* 如果数组中紧接有序区的无序区的第一个记录就是无序区中关键字值最小的,则不用交换 */ if (k != (i - 1)) { swap = array[i - 1]; array[i - 1] = array[k]; array[k] = swap; } } /* 算法分析 1. 关键字比较次数。 无论记录的初始状态,比较次数都是1 + 2 + 3 + 4 + ... + (n - 1) = n * (n -1) / 2; 2. 记录移动次数。 最好情况下0次, 正序, 最坏情况下3 * (n - 1)次, 反序。 那么直接选择排序的时间复杂度就是:O(n * n)。 3. 直接选择排序是一个就地排序。辅助空间O(1)。 非就地排序一般要求的辅助空间为O(n)。 4. 直接选择排序不稳定的。 反例 下标:【1 2 3】 关键字值:2 2 1 进过直接选择排序第一个2和第二个2相对位置发生了改变。 */ }