黑马程序员--Java简单排序算法

------- android培训java培训、期待与您交流! ----------

Java简单排序算法

最简单的排序方法:直接选择排序、冒泡排序。

选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。常用的选择排序方法有直接选择排序和堆排序。

直接选择排序:

1)关键字比较次数

无论文件初始状态如何,在第i趟排序中选出最小关键字的记录,需做n-i次比较,因此,总的比较次数为:n(n-1)/2=0(n2)

2)记录的移动次数

当初始文件为正序时,移动次数为0

文件初态为反序时,每趟排序均要执行交换操作,总的移动次数取最大值3(n-1)

直接选择排序的平均时间复杂度为O(n2)

 

 

class SelectionSort
{
	public static void main(String[] args)
	{
		double[] arr = new double[10000];
		for(int i=0;i<arr.length;i++)
		{
			arr[i]=(arr.length*Math.random());
		}
		//排序前时间
		long st1 = System.currentTimeMillis();
		//排序
		sort(arr);
		//排序后时间
		long st2 = System.currentTimeMillis();
		for(int i=0;i<arr.length;i++)
		{
			System.out.print(arr[i]+" ");
		}
		System.out.println("");
		System.out.println("共花费"+(st2-st1)+"毫秒");
	}
	
	public static void sort(double[] a)
	{
		int sortedLen= a.length;
		for(int i=0;i<sortedLen-1;i++)
		{
			for(int j=i+1;j<sortedLen;j++)
			{
				if(a[i]>a[j])
				{
					swap(a,i,j);
				}
			}
		}
	}
	public static void swap(double[] arr,int a,int b){
			double temp = arr[a];
			arr[a] = arr[b]; 
			arr[b] = temp;	
	}

}

 

交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。

冒泡排序:

1)算法的最好时间复杂度

若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:

Cmin=n-1

Mmin=0

冒泡排序最好的时间复杂度为O(n)

2)算法的最坏时间复杂度

若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1in-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

Cmax=n(n-1)/2=O(n2)

Mmax=3n(n-1)/2=O(n2)

冒泡排序的最坏时间复杂度为O(n2)

3)算法的平均时间复杂度为O(n2)

虽然冒泡排序不一定要进行n-1趟,但由于它的记录移动次数较多,故平均时间性能比直接插入排序要差得多。

class BubbleSort {
	public static void main(String[] args) {
		double[] arr = new double[10000];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (arr.length * Math.random());
		}
		// 排序前时间
		long st1 = System.currentTimeMillis();
		// 排序
		sort(arr);
		// 排序后时间
		long st2 = System.currentTimeMillis();
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println("");
		System.out.println("共花费" + (st2 - st1) + "毫秒");
	}

	public static void sort(double[] a) {
		int sortedLen = a.length;
		for (int i = 0; i < sortedLen - 1; i++) {
			for (int j = 0; j < sortedLen - i - 1; j++) {
				if (a[j] > a[j + 1]) {
					swap(a, j, j + 1);
				}
			}
		}
	}

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值