【Java】常见排序算法及面试考点总结

版权声明:小明酱私有,私自转载要捶你小胸口哦~ https://blog.csdn.net/alicelmx/article/details/88126902

一切为了暑期实习,一切为了暑期实习。
我就是试着去面面,实习是不可能实习的,老板是不会让我们去的。
哭!!!
以下是正题!!!


以下排序排名有先后之分,请注意复习策略~

快速排序

快排特别重要!!!
快排特别重要!!!
快排特别重要!!!

基本思想

  1. 首先在数组中选择一个基准点(一般选取第一个数字),
  2. 然后分别从数组的两端扫描数组,设两个指示标志(low指向起始位置,high指向末尾),
    ( 首先从后半部分开始,如果发现有元素比该基准点的值小,就交换low和high位置的值,然后从前半部分开始扫秒,发现有元素大于基准点的值,就交换low和high位置的值,如此往复循环,直到low>=high,然后把基准点的值放到high这个位置。一次排序就完成了。)
  3. 以后采用递归的方式分别对前半部分和后半部分排序,当前半部分和后半部分均有序时该数组就自然有序了。

代码实现

package algorithm;

public class QuickSort {
	public static void main(String[] args) {
		int[] arr={49,38,65,97};
		int low = 0, high = arr.length-1;
		quickSort(arr,low,high);
		
		for(int i=0;i<arr.length;i++)
			System.out.println(arr[i]);
	}
	
	public static void quickSort(int[] arr, int low, int high) {
		if(low >= high) return;
		int index = partition(arr,low,high);
		quickSort(arr,low,index-1);
		quickSort(arr,index+1,high);
	}
	public static int partition(int[] arr, int low, int high) {
		int key = arr[low];
		while(low < high) {
			while(low < high && arr[high] >= key) high --;
			arr[low] = arr[high];
			while(low < high && arr[low] <= key) low ++;
			arr[high] = arr[low];
		}
		arr[high] = key;
		return high;
	}
}

冒泡排序

基本思想

相邻两节点进行比较,大的向后移一个,经过第一轮两两比较和移动,最大的元素移动到了最后,第二轮次大的位于倒数第二个,依次进行。

代码实现

package algorithm;

public class BubbleSort {
	public static void main(String[] args) {
		int[] arr={49,38,65,97,76,13,27,49,78,34,12,64,5,4,62,99,98,54,56,17,18,23,34,15,35,25,53,51};
		bubbleSort(arr);
		for(int i=0;i<arr.length;i++)
			System.out.println(arr[i]);
	}
	
	public static void bubbleSort(int[] arr) {
		for(int i=0;i<arr.length-1;i++) {
			for(int j=0;j<arr.length-1-i;j++) {
				if(arr[j]>arr[j+1]) {
					int temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
		}
	}
}

直接插入排序

基本思想

遍历数组,遍历到i时,a0,a1…ai-1是已经排好序的,取出ai,从ai-1开始向前和每个比较大小,如果小于,则将此位置元素向后移动,继续先前比较,如果不小于,则放到正在比较的元素之后。可见相等元素比较是,原来靠后的还是拍在后边,所以插入排序是稳定的。

代码实现

package algorithm;

public class InsertSort {
	public static void main(String[] args) {
		int[] arr={49,38,65,97,76,13,27,49,78};
		insertSort(arr);
		for(int i=0;i<arr.length;i++)
			System.out.println(arr[i]);
	}
	public static void insertSort(int[] arr) {
		for(int i=1;i<arr.length;i++) {
			int temp = arr[i];
			int j=i-1;
			while(j>=0 && arr[j]>temp) {
				arr[j+1] = arr[j];
				j--;
			}
			arr[j+1] = temp;
		}
	}
}

归并排序

基本思想

首先考虑下如何将将二个有序数列合并。这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

代码实现

package algorithm;

public class MergeSort {
	public static void main(String[] args) {
		int[] arr={49,38,65,97,38};
		int low = 0, high = arr.length-1;
		mergeSort(arr,low,high);
		
		for(int i=0;i<arr.length;i++)
			System.out.println(arr[i]);
	}
	
	public static void mergeSort(int[] arr, int low, int high) {
		if(low < high) {
			int mid = (low+high)/2;
			mergeSort(arr,low,mid);
			mergeSort(arr,mid+1,high);
			merge(arr,low,mid,high);
		}
	}
	public static void merge(int[] arr, int low, int mid, int high) {
		int[] temp = new int[high-low+1];
		int k=0,i=low,j=mid+1;
		while(i<=mid && j<=high) {
			if(arr[i]<arr[j]) 
				temp[k++] = arr[i++];
			else
				temp[k++] = arr[j++];
		}
		while(i<=mid)
			temp[k++] = arr[i++];
		while(j<=high)
			temp[k++] = arr[j++];
		
		for(k=0;k<temp.length;k++) {
			arr[low+k] = temp[k];
		}
	}
}

简单选择排序

package algorithm;

public class SelectSort {
	public static void main(String[] args) {
		int[] arr={4,1,3,7};
		selectSort(arr);
		for(int i=0;i<arr.length;i++)
			System.out.println(arr[i]);
	}
	public static void selectSort(int[] arr) {
		for(int i=0;i<arr.length;i++) {
			int index=i;
			for(int j=i+1;j<arr.length;j++)
				if(arr[index]>arr[j]) 
					index = j;
			int temp = arr[index];
			arr[index] = arr[i];
			arr[i] = temp;
		}
	}
}

常考问题

排序的稳定性

  1. 不稳定(快些选一堆)
    选择排序(selection sort)— O(n2)
    快速排序(quicksort)— O(nlogn) 平均时间, O(n2) 最坏情况; 对于大的、乱序串列一般认为是最快的已知排序
    堆排序 (heapsort)— O(nlogn)
    希尔排序 (shell sort)— O(nlogn)
    基数排序(radix sort)— O(n·k); 需要 O(n) 额外存储空间 (K为特征个数)
  1. 稳定:
	插入排序(insertion sort)— O(n2)
	冒泡排序(bubble sort) — O(n2)
	归并排序 (merge sort)— O(nlog n); 需要 O(n) 额外存储空间
	二叉树排序(Binary tree sort) — O(nlogn); 需要 O(n) 额外存储空间
	计数排序  (counting sort)O(n+k); 需要 O(n+k) 额外存储空间,k为序列中Max-Min+1
	桶排序 (bucket sort)— O(n); 需要 O(k) 额外存储空间

猜你喜欢

转载自blog.csdn.net/alicelmx/article/details/88126902