简单选择排序(Java实现)

基本概念:


在要排序的一组数中,选出最小的一个数与第1个位置的数交换;然后在剩下的数当中再找最小的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。


简单选择排序的特点为:交换移动数据次数少,比较次数多。

下面给出具体的代码:

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  

达到了预期的目的


扫描二维码关注公众号,回复: 1120790 查看本文章

我们现在来分析一下最优情况下的复杂度和最差情况下的复杂度:

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

猜你喜欢

转载自blog.csdn.net/qq_32575047/article/details/80403112