选择排序介绍:
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)
选择排序过程:
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
- 初始状态:无序区为R[1..n],有序区为空。
- 第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。 ……
- 第i趟排序 第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
通俗的解释: 对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。
代码如下:
package com.nineweeks.simplesort;
/**
* 选择排序
*
* 规则:从左边开始 拿第一个值 作为基准值和右边的值相比较,如果右边的值比他小,
* 那这个值作为基准值和右边的值接着比较,直到最后一个值,
* 此时确定最小值得下标,和第一个值互换位置,再次循环开始,
* 从第二个值开始和右边的值比较,以此下去直到有序
*
* 选择排序,每经历一次循环,能够确定左边的值在准确的位置
*
* 选择排序的时间复杂度:
* 选择排序和冒泡排序需要相同的O(n2)的比较, 但是只需要O(n)次的交换
*
* @author NineWeek
* @date 2020/05/07 17:09
**/
public class SelectSort {
private long[] a;
private int nElems;
public SelectSort(int max){
a = new long[max];
nElems = 0;
}
public void insert(long value){
a[nElems++] = value;
}
public void selectSort(){
int in,out,min;
for (out = 0; out <nElems-1;out++){
min = out;
for (in = out; in < nElems; in++){
if(a[in] < a[min]){
min = in;
}
}
swap(min,out);
}
}
/**
* 数值之间的位置交换
* @param one
* @param two
*/
public void swap(int one ,int two ){
long temp;
temp = a[one];
a[one] = a[two];
a[two] = temp;
}
/**
* 数组的展示方法
*/
public void display(){
for (int i = 0; i < nElems ; i++) {
System.out.print(a[i]+" ");
}
System.out.println();
}
public static void main(String[] args){
SelectSort sort = new SelectSort(100);
sort.insert(77);
sort.insert(99);
sort.insert(44);
sort.insert(55);
sort.insert(22);
sort.insert(88);
sort.insert(11);
sort.insert(80);
sort.insert(66);
sort.insert(33);
sort.display();
System.out.println("=============");
sort.selectSort();
sort.display();
}
}
输出结果:
