JavaSE基础 - 数组排序之选择排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Vincent_Xupt/article/details/79735705

选择排序的原理:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

时间复杂度:最好或者最坏的情况下时间复杂度都是

为了方便后续操作,采用数组的静态创建方式创建原始数组,如下:

int[] arr = new int[]{12,-3,89,43,66};

排序过程如下:


过程解释:

第一次比较:用arr[0]和后面的每个数组数据做比较,由于arr[0] > arr[1],所以交换位置。第一次交换为后的数组为:-3,12,89,43,66。

第二次比较:用arr[1]和后面的每个数组数据做比较。由于arr[1] < arr[2-4],所以位置不变。非如此交换后的数组为:-3,12,89,43,66。

第三次比较:用arr[2]和后面的每个数组数据做比较。由于arr[2] > arr[3],所以交换位置;然后arr[2]继续和arr[4]继续比较,由于arr[2]小于arr[4],所以位置不变。第三次交换后的数组为:-3,12,43,89,66。

第四次比较:用arr[3]和arr[4]比较,由于arr[3] > arr[4],所以交换位置。最终结果为:-3,12,43,66,89。

规律:每次都用前一个数和后面所有的数做比较,只要碰到比它大的数就交换位置。

代码如下:

class ArrayDemo4
{
	public static void main(String[] args) 
	{
		int[] arr = new int[]{12,-3,89,43,66};
		selectSort(arr);
		show(arr);
	}

	//需求:选择排序(从小到大)
	public static void selectSort(int[] arr)
	{
		for (int i = 0; i < arr.length - 1; i++)
		{
			for (int j = i + 1; j < arr.length ; j++)
			{
				if (arr[i] > arr[j])
				{
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
		return;
	}

	//需求:显示排序后的数组。
	public static void show(int[] arr)
	{
		System.out.println("数组元素如下:");
		for (int i = 0; i < arr.length; i++)
		{
			System.out.print(arr[i] + " ");
		}
	}
}

选择排序的性能问题:选择排序的过程中,比较一遍,可能需要多次交换数组的元素的位置。如果能减少交换次数,便可以提高选择排序的性能。

改进1:定义两个变量,分别临时保存一次比较中最小的数和该数的角标值,一次比较结束后更换在数组中的位置.也就是说,一次比较,仅需交换一次位置,在一定程度上改善选择排序的性能。

代码如下:

class Sort 
{
	public static void main(String[] args) 
	{
		int[] arr = new int[]{12,-3,89,43,66};
		improveSelectSort(arr);
		show(arr);
	}

	public static void improveSelectSort(int[] arr)
	{
		int temp,index;		//存放一次比较后最小的值和该数的角标值。

		for (int i = 0; i < arr.length - 1; i++)
		{
			index = i;

			for (int j = i + 1; j < arr.length; j++)
			{
				if(arr[j] < arr[index])
				{
					index = j;
				}
			}

			//交换位置
			if(index != i){
				temp = arr[i];
				arr[i] = arr[index];
				arr[index] = temp;
			}

		}
	}

	public static void show(int[] arr)
	{
		System.out.println("排序后的数组元素如下:");
		for (int i = 0; i < arr.length; i++)
		{
			System.out.print(arr[i] + " ");
		}
	}
}

改进2:在改进1的基础之上对交换位置的代码块进行封装。(Ps:因为方法先要入栈内存,每次交换后都会被释放掉,所以斗胆尝试封装。具体会不会提高性能,这个我没验证过)

代码如下:

class Sort 
{
	public static void main(String[] args) 
	{
		int[] arr = new int[]{12,-3,89,43,66};
		improveSelectSort(arr);
		show(arr);
	}

	public static void improveSelectSort(int[] arr)
	{
		int temp,index;		//存放一次比较后最小的值和该数的角标值。

		for (int i = 0; i < arr.length - 1; i++)
		{
			index = i;

			for (int j = i + 1; j < arr.length; j++)
			{
				if(arr[j] < arr[index])
				{
					index = j;
				}
			}

			//交换位置
			if(index != i){
				swap(arr,i,index);		//调用swap方法。
			}

		}
	}

	public static void show(int[] arr)
	{
		System.out.println("排序后的数组元素如下:");
		for (int i = 0; i < arr.length; i++)
		{
			System.out.print(arr[i] + " ");
		}
	}

	public static void swap(int[] arr,int a,int b)
	{
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
}


总结:选择排序是几种排序算法中的基础算法。希望我的文章对你有帮助。


猜你喜欢

转载自blog.csdn.net/Vincent_Xupt/article/details/79735705