基本概念:
简单选择排序的特点为:交换移动数据次数少,比较次数多。
下面给出具体的代码:
package javastudy;
public class XuanZeSort {
public void selectionSort(int A[], int n) {
//简单选择排序算法,排序结果为递增数组
int min;//数组下标min永远指向每次集合比较中最小元素
//外层循环:n-1次
//需要注意到的是:数组的最大下标比数组的长度小1且数组的下标从0开始
for(int i=0;i<n-1;i++)
{
min = i;//给min赋初值,为数组的0号元素的下标
/**
* 第二层循环:循环n-1次
* j=i+1:初次比较的时候,i是靠前的那个元素 j是两个数字中靠后的那个元素
*/
for(int j=i+1;j<n;j++)
{ /**
当前面的数字大于后面的数字的时候 ,把后门数字的下标
赋值给min,保证下标min永远指向两个数字中最小的那一个
最终一轮比较下来,min指向的是集合元素比较当中最小的那一个元素
**/
if(A[min]>A[j])
{
min = j;
}
}
/**
* 如果min和i相等 也就是每一次的集合最前面的那个数字就是最小的
* 那么我们就不需要再进行交换 这样效率和稳定性更加高
*/
if(i!=min)
{
swap(A,i,min);
}
}
}
/**
*
* 交换函数
*
*
*/
public void swap(int A[], int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
主函数来调用一下:
package javastudy;
public class MainTest {
public static void main(String[] args) {
XuanZeSort sort = new XuanZeSort();
int A[] = {10,5,1,2,4,3,9,6};
sort.selectionSort(A, A.length);
for(int i=0;i<A.length;i++)
{
System.out.print(A[i]+" ");
}
}
}
控制台输出结果为:
1 2 3 4 5 6 9 10
达到了预期的目的
我们现在来分析一下最优情况下的复杂度和最差情况下的复杂度:
1.最优情况下:
排序的数字就是按照升序顺序排序的,我们发现外层循环和内层循环各要执行n-1次
所以复杂度为:o(n^2)
2.最差情况下:
排序的数字是降序顺序开始排序的,我们发现外层循环和内层循环还是各要执行n-1次
所以复杂度为:o(n^2);
3.平均时间复杂度为:o(n^2)
综上所述,无论什么情况下,简单选择排序的时间复杂度为o(n^2);
博客部分资源来源于:https://blog.csdn.net/qq_21688757/article/details/53749198