直接选择排序和它的优化
2016-06-02 17:14
387 查看
直接选择排序是一种比较直观的排序,它是从一个无序的额数组中选择一个最小或最大的并将这个最大的放在数组的开始或末尾,现在进行代码的实现:
[align=left]/****/[/align]
[align=left]if(parr[j]<min)是为了防止是相同的还进行交换,如果不介意交换的还可以直接让其交换,不过最好是相同的就不进行交换了。[/align]
[align=left]/********************/[/align]
[align=left]现在这个选择排序还有很大的优化空间,上述的方法的时间复杂度为O(n^2)。现在的优化方式是同时选出他的最大的和最小的。[/align]
[align=left]代码实现:[/align]
void SelectSort(int * parr,int size)//选择排序(升序) { for (int i = 0; i < size; i++) { int min = parr [i]; for (int j = i + 1; j < size; j++) { if (parr [j]<min) { swap(min, parr[j]); } } if (min!=parr [i]) { swap(min, parr[i]); } } }
[align=left]/****/[/align]
[align=left]if(parr[j]<min)是为了防止是相同的还进行交换,如果不介意交换的还可以直接让其交换,不过最好是相同的就不进行交换了。[/align]
[align=left]/********************/[/align]
[align=left]现在这个选择排序还有很大的优化空间,上述的方法的时间复杂度为O(n^2)。现在的优化方式是同时选出他的最大的和最小的。[/align]
[align=left]代码实现:[/align]
void SelectSort(int* parr, int size)//选择排序(优化方案) { int left; int right; for (left = 0,right = size - 1; left < right; left++, right--) { int min = parr[left]; int max = parr[right]; for (int i = left+1; i <= right; i++)//遍历找出最大和最小的元素 { if (min>parr[i]) { swap(min, parr[i]); } else if (parr[i] > max) { swap(max, parr[i]); } } if (min != parr[left]) { swap(min, parr[left]); if (max == parr[left]) { max = min; } } if (max != parr[right]) { swap(max, parr[right]); if (min == parr[right]) { min = max; } } } }同时总结选择排序最好的情况就是已经有序的,需要交换0次,最坏的就是逆序的,需要交换n-1次。
相关文章推荐
- AForm — 模型驱动的自动化表单解决方案
- 异常总结<经典例题>
- [置顶] input file上传图片预览(查看图片大小,类型,名字)------------------------------自己动手写jQuery插件
- 找出二维数组 n*m中的“鞍点”
- SwipeRefreshLayout初体验
- php array_map与array_walk使用对比
- 随笔(2016.05)
- DevExpress 2016.1正式将TreeMap Control加入WinForms版
- 8.1数组作数据成员
- codeforces 677A Vanya and Fence(水题)
- #14 – Page-Based Navigation(基于网页的应用程序)
- java interview 2
- error: command 'gcc' failed with exit status 1
- CODIS2.x集群 之 存储集群搭建全过程
- 设计模式之建造者模式(C++实现)
- Centos6.5下源码搭建lnmp环境
- Spring AOP AspectJ Pointcut Expressions With Examples--转
- 常用算法与设计模式
- 2015腾讯web前端笔试题
- 2.2相对布局