在一次写选择排序算法的时候,发现和冒泡没啥区别,后来发现写错了,写的就是冒泡而非选择。先看一下期初的代码:
template<typename T>
vector<T> selectionSort(vector<T> &arr)
{
for (int i = 0; i < arr.size(); i++)
{
int minIndex = i;
for (int j = i + 1; j < arr.size(); j++)
{
if (arr[minIndex] > arr[j])//条件成立就交换()
{
swap(arr[minIndex], arr[j]);
}
}
}
return arr;
}
再看一下冒泡:
/2.冒泡排序
template<typename T>
vector<T> bubbleSort(vector<T> &arr)
{
for (int i = 0; i < arr.size(); i++)
{
for (int j = i + 1; j < arr.size(); j++)
if (arr[i] > arr[j])
swap(arr[i], arr[j]);
}
return arr;
}
发现二者没有本质差别,都是找到最小值(默认升序排列)和预设值交换。再看一下真正的选择排序:
template<typename T>
vector<T> selectionSort(vector<T> &arr) {
for (int i = 0; i < arr.size(); i++) {
int minIndex = i;
for (int j = i + 1; j < arr.size(); j++)//找到最小的索引值,只交换一次
if (arr[j] < arr[minIndex])
minIndex = j;
swap(arr[i], arr[minIndex]);
}
return arr;
}
选择排序只是找索引,找到目标的索引再进行交换。因此可以说选择排序是冒泡排序的一种优化,因为冒泡只要条件成立就得交换,swap执行的次数多于选择排序。