Java中的排序问题

Java中的各种排序

  • 简单排序(冒泡排序、插入排序)
  • 希尔排序
  • 堆排序
  • 归并排序

冒泡排序

冒泡排序的源码:

public static void BubbleSort(int[] arr)
	{
		for(int i=arr.length-1; i >= 0; i--)
		{
			for(int j=0; j < i; j++)
			{
				if(arr[j] > arr[j+1])
				{
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
	}

//冒泡排序的优化,设置一个标记flag,如果遍历一次之后发现数组已经有序,那么跳出大循环即可
	public static void BubbleSort2(int[] arr)
	{
		for(int i=arr.length-1; i >= 0; i--)
		{
			int flag = 0;               //flag的0代表没有交换,1代表已经交换
			for(int j=0; j < i; j++)
			{
				if(arr[j] > arr[j+1])
				{
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
					flag = 1;
					System.out.println("交换一次...");
				}
			}
			
			if(flag == 0)
			{
				break;
			}
		}
	}

插入排序

插入排序的源码:

public static void InsertSort(int[] arr)
	{
		for(int i=1; i < arr.length; i++)
		{
			int temp = arr[i];
			int j;
			for(j=i-1; j >= 0 && arr[j] > temp; j--)
			{
				arr[j+1] = arr[j];
			}
			arr[j+1] = temp;            //这个要注意,应该是arr[j+1]而不是arr[j]
		}
	}

希尔排序

特点:利用了插入排序的简单,克服了插入排序中,每次只简单交换相邻元素的缺点

步骤:先进行大间隔排序,然后进行小间隔排序,最后进行1间隔排序;从n/2间隔开始

更小间隔的排序没有破环前面排序的结果

选择排序

堆排序

堆排序其实就是堆选择排序的一种改进

归并排序

策略:分而治之

快速排序

策略:分而治之
伪码描述:

void QuickSort(ElementType[] arr, int n)
{
    if(n < 2) return;
    pivot = 从arr中选出一个主元;主元要选择好
    将arr根据pivot分成两个独立的子集A1和A2:
    n = n1 + n2 + 1;
    arr = QuickSort(A1, n1) 并 pivot 并 QuickSort(A2, n2);
}

要点:
1.选主元:
经典的方法是,取头、中、尾的中位数
2.子集划分:

3.如果有元素正好等于pivot,那么有两种处理方法:
* 停下来交换 较好
* 不理它,继续移动指针
4.小规模数据的处理
当递归的数据规模充分小时,停止递归,直接调用简单排序 在程序中定义一个Cutoff的阈值

快速排序的源码:

public static void QuickSort(int[] arr, int left, int right)
	{
		int Cutoff = 3;               //添加一个阈值
		
		if(Cutoff <= right - left)
		{
			int pivot = Median3(arr, left, right);
			int i = left;
			int j = right - 1;
			for( ; ; )
			{
				while(arr[++i] < pivot);
				while(arr[--j] > pivot);
				
				if(i < j)
				{
					Swap(arr[i], arr[j]);
				}
				else
				{
					break;
				}
			}
			
			Swap(arr[i], arr[right-1]);
			
			QuickSort(arr, left, i - 1);
			QuickSort(arr, i, right);
		}
		else
		{
			InsertSort(arr);
		}
		
		
		
	}
	
	
	//找出三个数的中位数
	public static int Median3(int[] arr, int left, int right)
	{
		int mid = (left + right) / 2;
		if(arr[left] > arr[mid])
		{
			Swap(arr[left], arr[mid]);
		}
		if(arr[left] > arr[right])
		{
			Swap(arr[left], arr[right]);
		}
		if(arr[mid] > arr[right])
		{
			Swap(arr[mid], arr[right]);
		}
		
		Swap(arr[mid], arr[right-1]);          //将中间值放在right的左边
		
		return arr[right-1];
	}
	
	//交换两个元素的位置
	public static void Swap(int a, int b)
	{
		int temp = a;
		a = b;
		b = temp;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值