排序算法之选择排序
来源:互联网 发布:失业金数据与非农数据 编辑:程序博客网 时间:2024/06/07 23:04
选择排序,顾名思义是通过一种选择的方式对一组无序数列进行排序。那么,选择什么呢?选择出来什么之后又该如何排序?我们来重点讨论一下:
首先,我们来谈谈选择排序的原理,很简单的:从一组无序数列中选择一个最小值(最大值也可以,相应调整即可),把这个数放置在数列的首位,可以直接和第一位交换,此时原数列分为有序区和无序区两块,对无序区做相同的动作,无序区继续分为有序区和无序区两块......,就这样做下去,当无序区元素剩余为1时,算法结束。怎么样,有么有很简单。
现在,我们来找出这个算法要做的具体工作:
1.找到最小元素
2.将它与第一个元素交换,当然如果他就是第一个,就省略了。之所以直接与第一个元素交换,是因为这样做,挪动的元素最少。
3.重复1,2。
好的,来实现一下,上代码:
首先,我们来谈谈选择排序的原理,很简单的:从一组无序数列中选择一个最小值(最大值也可以,相应调整即可),把这个数放置在数列的首位,可以直接和第一位交换,此时原数列分为有序区和无序区两块,对无序区做相同的动作,无序区继续分为有序区和无序区两块......,就这样做下去,当无序区元素剩余为1时,算法结束。怎么样,有么有很简单。
现在,我们来找出这个算法要做的具体工作:
1.找到最小元素
2.将它与第一个元素交换,当然如果他就是第一个,就省略了。之所以直接与第一个元素交换,是因为这样做,挪动的元素最少。
3.重复1,2。
好的,来实现一下,上代码:
//寻找最小元素
private int minLocation(int[] list,int first, int last){
int minIndex; //存储最小下标
int loc; //存储当前元素的下标
minIndex = first;
for(loc = first + 1; loc <= last; loc++){//进行一趟比较,找出最小元素下标
if(list[loc] < list[minIndex])
minIndex = loc;
}
return minIndex;
}
//交换元素值
private void swap(int[] list,int first, int second){
int temp;
temp = list[first];
list[first] = list[second];
list[second] = temp;
}
//选择排序
public void selectSort(int[] list){
int loc, minIndex;
for(loc = 0; loc < list.length -1; loc++){ //从第一个元素开始,每次无序区元素少1
minIndex = minLocation(list, loc, list.length -1);//选择最小元素
swap(list, loc, minIndex);//交换
}
}
最后,我们来分析一下时间复杂度:
先贴一句话,时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)(来自http://blog.csdn.net/firefly_2002/article/details/8008987),那么在这个算法中受n变化影响最大的就是涉及到循环的语句了,有两句:
1. minIndex = minLocation(list, loc, list.length -1);//选择最小元素
2.swap(list, loc, minIndex);//交换
假设list.length = n,那么,外循环执行(n-1)次
在swap()中的三句赋值语句每次循环执行一次,所以执行次数为3(n-1)
在minLocation()中,内循环执行(n-1-i)次,所以总执行次数是(n-1)+(n-2)+...+2+1= n*(n-1)/2 =
1/2(n^2)-1/2(n) = 1/2(n^2)+O(n) = O(n^2).
即就是,如果n= 1000时,执行总次数为1/2 * 1000^2 - 1/2 * 1000 = 499500,约等于50万次。
好了本篇文章到此结束,下篇再见。
先贴一句话,时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数)(来自http://blog.csdn.net/firefly_2002/article/details/8008987),那么在这个算法中受n变化影响最大的就是涉及到循环的语句了,有两句:
1. minIndex = minLocation(list, loc, list.length -1);//选择最小元素
2.swap(list, loc, minIndex);//交换
假设list.length = n,那么,外循环执行(n-1)次
在swap()中的三句赋值语句每次循环执行一次,所以执行次数为3(n-1)
在minLocation()中,内循环执行(n-1-i)次,所以总执行次数是(n-1)+(n-2)+...+2+1= n*(n-1)/2 =
1/2(n^2)-1/2(n) = 1/2(n^2)+O(n) = O(n^2).
即就是,如果n= 1000时,执行总次数为1/2 * 1000^2 - 1/2 * 1000 = 499500,约等于50万次。
好了本篇文章到此结束,下篇再见。
0 0
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 【排序算法】之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 算法-排序之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- 排序算法之选择排序
- UILabel添加点击事件
- struts2学习之访问Servlet对象的两种实现方式
- java学习路线2
- [LeetCode]Word Search
- spring容器使用外部文件
- 排序算法之选择排序
- 学英语《每日一歌》之right here waiting
- 安卓中的socket通讯
- HDU2833 WuKong(floyd + dp)经典
- Pow(x, n)
- DirectX9 三角形单元
- 扫雷
- 深入浅出Java回调机制
- eclipse打不开,而且没有提示窗口