大家都学习过数据结构,都知道各种各样的排序方法,比如冒泡排序,选择排序,堆排序,归并排序等等,我学习的教材是C语言版的,今天处于好奇,写了一个用Java语言实现的直接选择排序的程序,与大家分享一下。
直接选择排序的思想是;
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](1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[1..i]和R[i+1..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。
用Java实现的代码如下:
/**//*
*@author 我为J狂 建立日期 2007-4-16
*
*/
package net.blogjava.lzqdiy;
public class MySort
{
/** *//**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
int n = Integer.parseInt(args[0]);// 输入数组长度
double R[] = new double[n];
if (n == 0)
System.out.println("数组为空");
else
{
System.out.println("排序前:");
for (int i = 0; i < n; i++)
R[i] = Double.parseDouble(args[i + 1]);// 输入数组元素。
for (int i = 0; i < n; i++)
{
if (i > 0)
System.out.print(",");
System.out.print(R[i]);
}
double temp = 0;
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (R[j] < R[i])
{
temp = R[i];
R[i] = R[j];
R[j] = temp;
}
}
}
System.out.println();
System.out.println("排序后:");
for (int i = 0; i < n; i++)
{
if (i > 0)
System.out.print(",");
System.out.print(R[i]);
}
}
}
}
程序运行过程:
程序的运行结果是:
排序前:
3.6,7.4,2.1,3.3,2.0
排序后:
2.0,2.1,3.3,3.6,7.4
算法分析
(1)关键字比较次数 无论文件初始状态如何,在第i趟排序中选出最小关键字的记录,需做n-i次比较,因此,总的比较次数为:
n(n-1)/2=0(n
2)
(2)记录的移动次数 当初始文件为正序时,移动次数为0
文件初态为反序时,每趟排序均要执行交换操作,总的移动次数取最大值3(n-1)。
直接选择排序的平均时间复杂度为O(n
2)。
(3)直接选择排序是一个就地排序
(4)稳定性分析 直接选择排序是不稳定的
【例】反例[2,
2,1]