算法的设计策略:
1:蛮力法------穷尽所有可能性
2:递归技术:hanno法
3:分治法:分而制之:一分二二分四的思想
4:模拟法:模拟实际场景
5:贪心算法:当前最大利益,例如炒股大多数股民都是考虑当前最大利益
6:优化法:生物学优选原理,例如基因
插入、冒泡、选择事件复杂度:O(N^2)
快速排序法:O(N*logN)
选择排序:每次选择一个最小(或最大)的元素放到相应的位置
Goodcase1:一个桌子上有方块A到方块K13张扑克派,如何排序?
:每次拿剩下的牌中最小的那个放到手里即可即:每次拿最小的那个放到手里当没有牌了排序就完成了。
Goodcase2:一个数组里面有几个423981如何选择排序
1:1423981前
2:1243982前
3:1234983前
4:1234984前
5:123489 8前
算法步骤:
1:i从0~N-1
2:找从下标[i]到下标[N-1]的数据中最小元素的位置minPos
3:把最小元素与下标是[i]的元素交换
☞:运行结束,好比已经没有扑克牌
代码:
#include <iostream> #include <ctime> using namespace std; //算出运算所用事件 //定义 SelectSort 方法 类型灵活一些 typedef int T; void SelectSort (T* arr, int num) { int minPos = 0; //I:遍历 从0 到num-1(因为最后一个不用比所以为num-1 ,注意个数和坐标最大值之间的换算) for(int i=0; i<num-1; i++) { // 1:确定插入位置(i)位置正巧为i 2:确定最小元素位置 minPos 需要循环判断 minPos = i; //假设第一个是最小的位置 for (int j=i+1; j < num; j++) //注意j从i后一个开始对边前面 j < num因为要比较最后一项 { if(arr[j] < arr[minPos]) //找到最小的 { minPos = j; //找到最小的位置 } } //2:交换minPos 和 插入位置(i)的值 swap(arr[minPos], arr[i]); } } int main() { //定义102400长度的数组 越长越能计算所需世间 赋值 const int kNum = 102400; T arr[kNum]; for (int i=0; i<kNum; i++) { arr[i] = kNum - i; } time_t tStart = time(NULL); SelectSort(arr, kNum); time_t tEnd = time(NULL); cout<<"require time:"<<tEnd-tStart <<endl; //打印前十个看看是否完成排序 for(int i =0; i<10; i++) { cout<<arr[i]<<" "; } system("pause"); return 0; }
运行结果: