赞
踩
记住原理很重要,把原理记住了,代码也就记住了
n为排序数组长度,
循环n-1次,每次选择最大值索引,交换该索引的值和排序数组终点索引的值。
第一层:控制排序数组的终点索引。
for (int i = array.size() - 1; i > 0; i--)
第二层:选择最大值索引。
int temp = j;
for (int j = 0; j < i; j++) {
if (array[j] > array[temp]) temp = j;
}
最后一步,交换终点索引和最大值索引的值。
if (temp != i) swap(array[temp], array[i]);
void select(vector<int> & array) {
for (int i = array.size() - 1; i > 0; i--) {
int temp = i;
for (int j = 0; j < i; j++) {
if (array[j] > array[temp]) temp = j;
}
if (temp != i) swap(array[temp], array[i]);
}
}
每次排序都仅仅选出一个值,效率低。
注意点:
void select_optimize(vector<int> & array) {
int l = 0, r = array.size() - 1;
while (l < r) {
int max_p = r, min_p = l;
for (int i = l; i <= r; i++) {
if (array[i] > array[max_p]) max_p = i;
if (array[i] < array[min_p]) min_p = i;
}
if (min_p != l) swap(array[min_p], array[l]);
if (max_p == l) max_p = min_p;//特殊情况处理
if (max_p != r) swap(array[max_p], array[r]);
r--;
l++;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。