Java实现数组排序

选择排序法

算法原理
首先原数组(未按顺序)如下(第一行表示对应位置存储的数据,第二行是其对应数据的索引值)
在这里插入图片描述
选择排序法即是先将第一个数据分别与右侧其他数据依次比较,当第一个数据较大时,对调两数据位置,最终第一个位置的数据将是数组元素的最小值;再对第二个数据分别与右侧其他数据依次比较,当第二个数据较大时,对调两数据位置,最终第二个位置的数据将是除第一个数据之外的数组元素的最小值。同理可以进行其他位置的比较和对调。如下:
在这里插入图片描述
程序代码

class test
{
	public static void main(String[] args)
	{
		int[] Arr = new int[]{14,52,56,32,17};
		printArray(Arr);
		selectSort(Arr);
		printArray(Arr);
	}
	
	public static void printArray(int[] arr)
	{
		System.out.print("[");
		for(int x=0; x<arr.length; x++)
		{
			if(x!=arr.length-1)
				System.out.print(arr[x]+",");
			else
				System.out.println(arr[x]+"]");
		}
	}
	
	public static void swap(int[] arr, int a, int b)
	{
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
	
	//选择排序法
	public static void selectSort(int[] arr)
	{
		for(int x=0; x<arr.length-1; x++)
		{
			for(int y=x+1; y<arr.length; y++)
			{
				if(arr[x]>arr[y])
					swap(arr,x,y);
			}
		}
	}
}

但是仔细沿着过程我们会发现,有的位置上其实进行了多次对调,当数据较少时性能影响不大,但是当数据量较大的时候,这必将带来运算的缓慢,于是我们可以想办法减少对调交换位置的次数。我们可以通过另外设置两个变量,以第一个数据的比较为例,先将第一位数据存储在num中,然后将第一个下标存储在index中,接下来用num与后边值依次比较,较小者直接赋值给num存储起来并用index存储下标,直到比较结束,最终将index指代的下标对应的数组数据与第一个数据进行交换,即可使得第一位数据为数组元素的最小值。以此类推,每一轮比较结束都可以使该轮的首位元素成为右边元素的最小值,同时每一轮也只进行了一次对调,显然减少了对调交换的次数。
改进后的代码

/*
需求:对数组进行升序排序
思路:利用选择排序算法
步骤:
1.定义生成一个未排序的数组
2.打印原数组
3.排序
4.打印新数组
*/

class test
{
	public static void main(String[] args)
	{
		int[] Arr = new int[]{14,52,56,32,17};
		printArray(Arr);
		selectSort2(Arr);
		printArray(Arr);
	}
	
	public static void printArray(int[] arr)
	{
		System.out.print("[");
		for(int x=0; x<arr.length; x++)
		{
			if(x!=arr.length-1)
				System.out.print(arr[x]+",");
			else
				System.out.println(arr[x]+"]");
		}
	}
	
	public static void swap(int[] arr, int a, int b)
	{
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
	
	//选择排序法(改进)减少了换位次数
	public static void selectSort2(int[] arr)
	{
		for(int x=0; x<arr.length-1; x++)
		{
			int num = arr[x];
			int index = x;
			for(int y=x+1; y<arr.length; y++)
			{
				if(num>arr[y])
				{
					num = arr[y];
					index = y ;
				}
			}
			if(index!=x)
				swap(arr,index,x);
		}
	}
}

冒泡排序法

算法原理
首先原数组(未按顺序)如下(第一行表示对应位置存储的数据,第二行是其对应数据的索引值)
在这里插入图片描述
冒泡排序法即是先将第一个数据与第二个元素比较,当第一个数据较大时,对调两数据位置;再对第二个数据与第三个数据比较,当第二个数据较大时,对调两数据位置;以此类推一直比较到最后一个元素,最终最后位置的数据将是数组元素的最大值。如下:
在这里插入图片描述
程序代码

/*
需求:对数组进行升序排序
思路:利用冒泡排序算法
步骤:
1.定义生成一个未排序的数组
2.打印原数组
3.排序
4.打印新数组
*/

class Array4
{
	public static void main(String[] args)
	{
		int[] Arr = new int[]{14,52,56,32,17};
		printArray(Arr);
		bubbleSort(Arr);
		printArray(Arr);
	}
	
	public static void printArray(int[] arr)
	{
		System.out.print("[");
		for(int x=0; x<arr.length; x++)
		{
			if(x!=arr.length-1)
				System.out.print(arr[x]+",");
			else
				System.out.println(arr[x]+"]");
		}
	}
	
	public static void swap(int[] arr, int a, int b)
	{
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
	
	//冒泡排序法1
	public static void bubbleSort(int[] arr)
	{
		for(int x=0; x<arr.length-1; x++)
		{
			for(int y=0; y<arr.length-1-x;y++)
			{
				if(arr[y]>arr[y+1])
					swap(arr,y+1,y);
			}
		}
	}
}

/*
需求:对数组进行升序排序
思路:利用冒泡排序算法
步骤:
1.定义生成一个未排序的数组
2.打印原数组
3.排序
4.打印新数组
*/
class Array4
{
	public static void main(String[] args)
	{
		int[] Arr = new int[]{14,52,56,32,17};
		printArray(Arr);
		bubbleSort2(Arr);
		printArray(Arr);
	}
	
	public static void printArray(int[] arr)
	{
		System.out.print("[");
		for(int x=0; x<arr.length; x++)
		{
			if(x!=arr.length-1)
				System.out.print(arr[x]+",");
			else
				System.out.println(arr[x]+"]");
		}
	}
	
	public static void swap(int[] arr, int a, int b)
	{
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
	
	//冒泡排序法2
	public static void bubbleSort2(int[] arr)
	{
		for(int x=arr.length-1; x>=0; x--)
		{
			for(int y=0; y<x; y++)
			{
				if(arr[y]>arr[y+1])
					swap(arr,y+1,y);
			}
		}
	}
}

直接调用库函数排序

以上两种排序虽然涉及到算法基础,但是在实际工程应用中,性能并不算是太好,在实际应用中,java将排序函数封装到了库中,我们一般直接调用来使用。

/*
需求:对数组进行升序排序
思路:直接导入库调用数组函数
步骤:
1.定义生成一个未排序的数组
2.打印原数组
3.排序
4.打印新数组
*/
import java.util.*;

class Array4
{
	public static void main(String[] args)
	{
		int[] Arr = new int[]{14,52,56,32,17};
		printArray(Arr);
		Arrays.sort(Arr);
		printArray(Arr);
	}
	
	public static void printArray(int[] arr)
	{
		System.out.print("[");
		for(int x=0; x<arr.length; x++)
		{
			if(x!=arr.length-1)
				System.out.print(arr[x]+",");
			else
				System.out.println(arr[x]+"]");
		}
	}
	
	public static void swap(int[] arr, int a, int b)
	{
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值