二、选择排序
2016-03-13 13:58
507 查看
1、算法原理
选择排序的方法可以理解为通过挑选的方式来进行排序,从第一次开始,每一次从数组中拿出最小的数,放在指定位置。第i次就放在第i个位置,这样保证了数组0~i都是按顺序排好的,只需要继续执行将i+1~n排序即可。
选择排序的平均时间复杂度为:O(n^2)。
选择排序的空间复杂度为:O(1)。
由于某些情况下,对于有重复数字的数组序列,前一个数字挪到另一个的后面,如序列{2,3,3,1},会将第一个3跟1调换,那么原来序列中的两个3前后顺序就被破坏了,所以选择排序是一个不稳定的排序。
2、代码实现
(1)JAVA实现
注:本代码设计随机生成10个1~100内的数,再对这10个数进行选择排序;
/*
* 排序算法:选择排序
* 作者:xiaoxiao
* 时间:2016.03.11
*/
import java.util.Random;
public class SelectSort {
public static void main(String[]args){
int[]
arr =
new
int[10];//定义一个可以存100个数的数组
init(arr);
for(inti=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
SelectSort(arr);
System.out.println("");
for(inti=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
public
static void init(int[]a){
Random r =new Random();
for(inti=0;i<a.length;i++){
a[i] =r.nextInt(100);
}
}
public static void SelectSort(int[] a){
int temp = 0;
for(inti=0;i<a.length-1;i++){
int
minFlag =i;//选定第i个数做比较
for(intj=i+1;j<a.length;j++){
if(a[j]<a[minFlag]){
minFlag =
j;
}
}
if(minFlag!=i){//如果最小的数坐标不是选定的第i个数的坐标,则交换
temp =a[i];
a[i] =a[minFlag];
a[minFlag] =temp;
}
}
}
}
运行结果:
(2)PHP实现
注:本代码设计随机生成10~20个1~100内的数,再对这10~20个数进行选择排序;
<!--
Author: xiaoxiao
Date: 2016-03-17
-->
<?php
echo "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />";//如果涉及到PHP网页中文乱码问题,加上该行
function SelectSort($a){
$length = count($a);
for($i=0; $i<$length-1; $i++){
$minFlag = $i;//设置默认最小数为第i个数字
for ($j=$i+1; $j < $length; $j++) { //对第i+1~$length的数字进行查找,找到最小数字对应的坐标
if ($a[$j]<$a[$minFlag]) {
$minFlag = $j;
}
}
if ($minFlag != $i) {
$temp = $a[$minFlag];
$a[$minFlag] = $a[$i];
$a[$i] = $temp;
}
}
return $a;
}
$a = array();
$nums = mt_rand(10,20);
for ($i=0; $i < $nums; $i++) {
array_push($a, mt_rand(1,100));
}
echo "待排序的数有".$nums."个!<br />";
echo "Before SelectSort: ";
for($i=0; $i<count($a); $i++){
echo $a[$i];
echo ", ";
}
echo "<br />";
echo "After SelectSort: ";
$b = SelectSort($a);
for($i=0; $i<count($b); $i++){
echo $b[$i];
echo ", ";
}
?>
运行结果:
选择排序的方法可以理解为通过挑选的方式来进行排序,从第一次开始,每一次从数组中拿出最小的数,放在指定位置。第i次就放在第i个位置,这样保证了数组0~i都是按顺序排好的,只需要继续执行将i+1~n排序即可。
选择排序的平均时间复杂度为:O(n^2)。
选择排序的空间复杂度为:O(1)。
由于某些情况下,对于有重复数字的数组序列,前一个数字挪到另一个的后面,如序列{2,3,3,1},会将第一个3跟1调换,那么原来序列中的两个3前后顺序就被破坏了,所以选择排序是一个不稳定的排序。
2、代码实现
(1)JAVA实现
注:本代码设计随机生成10个1~100内的数,再对这10个数进行选择排序;
/*
* 排序算法:选择排序
* 作者:xiaoxiao
* 时间:2016.03.11
*/
import java.util.Random;
public class SelectSort {
public static void main(String[]args){
int[]
arr =
new
int[10];//定义一个可以存100个数的数组
init(arr);
for(inti=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
SelectSort(arr);
System.out.println("");
for(inti=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
public
static void init(int[]a){
Random r =new Random();
for(inti=0;i<a.length;i++){
a[i] =r.nextInt(100);
}
}
public static void SelectSort(int[] a){
int temp = 0;
for(inti=0;i<a.length-1;i++){
int
minFlag =i;//选定第i个数做比较
for(intj=i+1;j<a.length;j++){
if(a[j]<a[minFlag]){
minFlag =
j;
}
}
if(minFlag!=i){//如果最小的数坐标不是选定的第i个数的坐标,则交换
temp =a[i];
a[i] =a[minFlag];
a[minFlag] =temp;
}
}
}
}
运行结果:
(2)PHP实现
注:本代码设计随机生成10~20个1~100内的数,再对这10~20个数进行选择排序;
<!--
Author: xiaoxiao
Date: 2016-03-17
-->
<?php
echo "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />";//如果涉及到PHP网页中文乱码问题,加上该行
function SelectSort($a){
$length = count($a);
for($i=0; $i<$length-1; $i++){
$minFlag = $i;//设置默认最小数为第i个数字
for ($j=$i+1; $j < $length; $j++) { //对第i+1~$length的数字进行查找,找到最小数字对应的坐标
if ($a[$j]<$a[$minFlag]) {
$minFlag = $j;
}
}
if ($minFlag != $i) {
$temp = $a[$minFlag];
$a[$minFlag] = $a[$i];
$a[$i] = $temp;
}
}
return $a;
}
$a = array();
$nums = mt_rand(10,20);
for ($i=0; $i < $nums; $i++) {
array_push($a, mt_rand(1,100));
}
echo "待排序的数有".$nums."个!<br />";
echo "Before SelectSort: ";
for($i=0; $i<count($a); $i++){
echo $a[$i];
echo ", ";
}
echo "<br />";
echo "After SelectSort: ";
$b = SelectSort($a);
for($i=0; $i<count($b); $i++){
echo $b[$i];
echo ", ";
}
?>
运行结果:
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树