排序算法——选择排序
选择排序是经典的排序算法之一,他将数据分为有序区和无序区,每一次遍历将会找到无序区中最小的数据,然后插入有序区的末尾。具体过程如下:
- 定义a[0]…..到 a[n-1] 的N位数的数组
- 第一次遍历,找到数组中 a[0] 到 a[n - 1] 中的最小数 ,然后与a[0] 交换(如果a[0] 最小,就与它本身交换)
- 第二次遍历,找到数组中 a[1] 到 a[n - 1] 中的最小数 ,然后与a[1] 交换
- 第三次遍历,找到数组中 a[2] 到 a[n - 1] 中的最小数 ,然后与a[2] 交换
- 第四次遍历,找到数组中 a[3] 到 a[n - 1] 中的最小数 ,然后与a[3] 交换
- 第 i 次遍历,找到数组中a[i-1] 到 a[n-1] 中的最小数,然后与a[i] 交换
选择排序的代码实现如下(java)
package com.hbcode.sort;
/**
* Created by IntelliJ IDEA.
* User:hubin
* Description:选择排序
* Date:2018/1/10
* Time:8:40
*/
public class Selection {
public static void main(String[] agrs){
double[] data = {1,2,1,6,7,81,2,3123,42,321};
sort(data);
disPlay(data);
}
/**
* 选择排序
* @param data
*/
public static void sort(double[] data){
for(int i = 0; i < data.length ;i++){
//data[0]....到 data[i-1] 是有序区,a[i] 到 data[data.length - 1] 是无序区
int min = i;
//找到 data[i] 和data[data.length - 1]中最小的数
for(int j = i; j < data.length;j++){
if(less(data[j],data[min])){
min = j;
}
}
//将 data[i] 和 data[data.length - 1]中最小的数与data[i]交换
each(data,i,min);
}
}
/**
* 打印数组
* @param data
*/
public static void disPlay(double[] data){
for (int i =0; i <data.length;i++){
System.out.print(data[i] + " ");
}
}
/**
* 交换数组中两数据位置
* @param data
* @param i
* @param j
*/
public static void each(double[] data,int i,int j){
double temp = data[i];
data[i] = data[j];
data[j] = temp;
}
/**
* 比较两数据大小
* @param a
* @param b
* @return
*/
public static boolean less(double a,double b){
return a < b ? true:false;
}
}
运行结果为
选择排序是一种简单很容易实现的排序算法,选择排序的运行时间与输入数据没有关系,每一次查找无序区中的最小数都要遍历一次无序区,所以在某些情况下,比如待排序的数组已经是有序的了,但他的运行速度和同长度的无序数组排序所需的速度一样,这是他的缺点