排序算法基础总结

Posted 少年风华正茂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法基础总结相关的知识,希望对你有一定的参考价值。

算法基础总结

经典算法java代码实现

1.冒泡排序

	/***
	 * @冒泡排序
	 * @BubbleSort
	 * @param arr
	 */
	public static void BubbleSort(int[] arr)
		if(arr == null || arr.length<2)
			return;
		
		for(int i = arr.length-1;i>0;i--)
			for(int j=0;j<i;j++)
				if(arr[j]>arr[j+1])
					swap(arr,i,j);
			
		
	

2.选择排序

	/***
	 * @选择排序
	 * @SelectionSort 两个指针,一个遍历指针,一个指向当前的最值
	 * @param arr
	 */
	public static void SelectionSort(int[] arr)
		if(arr == null || arr.length<2)
			return;
		
		for (int i = 0; i < arr.length - 1; i++) 
			int minIndex = i;
			for (int j = i + 1; j < arr.length; j++) 
				minIndex = arr[j] < arr[minIndex] ? j : minIndex;
			
			swap(arr, i, minIndex);
		
	

3.插入排序

	/***
	 * @插入排序
	 * @InsertionSort
	 * @param arr
	 */
	public static void InsertionSort(int[] arr)
		if(arr == null || arr.length<2)
			return;
		
		for(int i = 1 ; i < arr.length;i++)
			for(int j = i-1 ; j >=0;j--)
				if(arr[j]<arr[j+1])
					swap(arr,j,j+1);
				else
					break;
			
		
	

4.归并排序

	/***
	 * @归并排序
	 * @mergeSort
	 * @param arr
	 */
	public static void mergeSort(int[] arr) 
		if (arr == null || arr.length < 2) 
			return;
		
		mergeSort(arr, 0, arr.length - 1);
	
	
	public static void mergeSort(int[] arr, int l, int r) 
		if (l == r) 
			return;
		
		int mid = l + ((r - l) >> 1);
		mergeSort(arr, l, mid);
		mergeSort(arr, mid + 1, r);
		merge(arr, l, mid, r);
	
	//两个有序数组 (l-m) (m+1 - r)的合并
	public static void merge(int[] arr, int l, int m, int r) 
		int[] help = new int[r - l + 1];//R-L+1
		int i = 0;
		int p1 = l;
		int p2 = m + 1;
		while (p1 <= m && p2 <= r) 
			help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
		
		while (p1 <= m) 
			help[i++] = arr[p1++];
		
		while (p2 <= r) 
			help[i++] = arr[p2++];
		
		for (i = 0; i < help.length; i++) 
			arr[l + i] = help[i];
		
	

5.快速排序

	/***
	 * @快速排序  应用:荷兰国旗问题
	 * @quickSort
	 * @param arr
	 */
	public static void quickSort(int[] arr) 
		if (arr == null || arr.length < 2) 
			return;
		
		quickSort(arr, 0, arr.length - 1);
	

	public static void quickSort(int[] arr, int l, int r) 
		if (l < r) 
			swap(arr, l + (int) (Math.random() * (r - l + 1)), r);//随机快排,L-R上随机选个位置和R上的交换
			int[] p = partition(arr, l, r);
			quickSort(arr, l, p[0] - 1);
			quickSort(arr, p[1] + 1, r);
		
	

	public static int[] partition(int[] arr, int l, int r) //以R位置上的数为参考值,小的左边,大的右边,等于的放中间
		int less = l - 1;
		int more = r;
		while (l < more) 
			if (arr[l] < arr[r]) 
				swap(arr, ++less, l++);
			 else if (arr[l] > arr[r]) 
				swap(arr, --more, l);
			 else 
				l++;
			
		
		swap(arr, more, r);
		return new int[]  less + 1, more ;
	

6.堆排序

	/***
	 * @堆排序
	 * 1.求大根堆
	 * 2.交换首尾
	 * 3.通过heapify下沉首节点
	 * @heapSort
	 * @param arr
	 */
	public static void heapSort(int[] arr) 
		if (arr == null || arr.length < 2) 
			return;
		
		for (int i = 0; i < arr.length; i++) //构建初始大根堆
			heapInsert(arr, i);
		
		int size = arr.length;
		swap(arr, 0, --size);
		while (size > 0) 
			heapify(arr, 0, size);//构建出大根堆
			swap(arr, 0, --size);
		
	
	public static void heapInsert(int[] arr, int index) //构造大根堆,index与其父节点比较
		while (arr[index] > arr[(index - 1) / 2]) //arr[(0-1)/2] = arr[0]
			swap(arr, index, (index - 1) / 2);
			index = (index - 1) / 2;
		
	
	public static void heapify(int[] arr, int index, int size) //由于将最大值和arr[0]互换,不规范的节点往下沉的过程
		int left = index * 2 + 1;//index的左孩子
		while (left < size) 
			int largest = left + 1 < size && arr[left + 1] > arr[left] ? left + 1 : left;//记录当前孩子节点的最大值下标
			largest = arr[largest] > arr[index] ? largest : index;//记录当前子树(三个结点)的最大值下表
			if (largest == index) 
				break;
			
			swap(arr, largest, index);//交换最大值
			index = largest;
			left = index * 2 + 1;
		
	

7.交换两个数的值

	/***
	 * @公共调用方法
	 * @采用两次异或交换两个数 
	 * @swap a,b
	 * @param arr
	 * @param i
	 * @param j
	 */
	public static void swap(int[] arr,int i,int j)
		arr[i] = arr[i]^arr[j];
		arr[j] = arr[i]^arr[j];
		arr[i] = arr[i]^arr[j];
	

以上是关于排序算法基础总结的主要内容,如果未能解决你的问题,请参考以下文章

[数据结构]九大基础排序算法总结

二叉树算法

排序算法基础总结

排序算法基础总结

基础JavaScript练习总结

10种排序算法基础总结