从今天开始把之前学习过的数据结构和算法复习一下,写下博客当做一种总结。先从最简单的O(n^2)排序算法写起,先讲一下选择排序。
选择排序的思想就是遍历整个数组,假设我们是要从小到大对数组进行排序。那么每次遍历都找到数组中的当前最小元素,然后放置在它的正确位置上。举个例子,假如我们要对[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]这个数组进行排序,第一次遍历时,从十个元素中找到最小的元素1,然后将该元素与第一个位置的元素交换位置,即与10交换位置。经过这一次遍历之后,1就已经放置在正确的位置上了,那么第二次遍历时,只需要从第二个元素开始查找接下来9个元素中的最小值,然后放置在第二个位置上,接下来的步骤以此类推。
下面是代码的c++实现,使用了模板:
#include <iostream>
using namespace std;
//选择排序
//时间复杂度为O(n^2)
template<typename T>
void selectionSort( T arr[], int n ){
for( int i = 0; i < n; i ++ ){
int minIndex = i;//最小值的索引
for( int j = i + 1; j < n; j ++ ){
if( arr[j] < arr[minIndex] )
minIndex = j;
}
swap( arr[minIndex], arr[i] );
}
}
int main()
{
int a[] = {10,9,8,7,6,5,4,3,2,1};
selectionSort( a, 10 );
for( int i = 0; i < 10; i ++ )
cout << a[i] << " ";
cout << endl;
return 0;
}