排序算法 面试 JAVA
2015-09-23 11:26
465 查看
**1.内部排序算法:
**选择排序(直接选择排序,堆排序)
交换排序(冒泡排序,快速排序)
插入排序(直接插入排序,折半插入排序,Shell排序)
归并排序
桶式排序
基数排序**
2.外部排序**
最常用的是多路归并排序,即将原文件分解称多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序,接下来再对多个有序的子文件进行**归并排序**。
**冒泡排序**
**插入排序**
**选择排序**
**快速排序**
**堆排序**
**归并排序**
**基数排序**
**选择排序(直接选择排序,堆排序)
交换排序(冒泡排序,快速排序)
插入排序(直接插入排序,折半插入排序,Shell排序)
归并排序
桶式排序
基数排序**
2.外部排序**
最常用的是多路归并排序,即将原文件分解称多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序,接下来再对多个有序的子文件进行**归并排序**。
**冒泡排序**
/* * 冒泡排序 */ public class BubbleSort { public void bubble(Integer[] data){ for(int i=0;i<data.length;i++){ for(int j=0;j<data.length-1-i;j++){ if(data[j]>data[j+1]){ //如果后一个数小于前一个数交换 int tmp=data[j]; data[j]=data[j+1]; data[j+1]=tmp; } } } } }
**插入排序**
public static void insertSort(int[] array) { if (array == null || array.length < 2) { return; } for (int i = 1; i < array.length; i++) { int tmp = array[i]; int position = i; for (int j = i - 1; j >= 0; j--) { if (array[j] > tmp) { array[j + 1] = array[j]; position--; } else { break; } } array[position] =tmp; } }
**选择排序**
public static void selectSort(Integer[] a) { if (a == null || a.length <= 0) { return; } for (int i = 0; i < a.length; i++) { int min = i; /* 将当前下标定义为最小值下标 */ for (int j = i + 1; j < a.length; j++) { if (a[min] > a[j]) { /* 如果有小于当前最小值的关键字 */ min = j; /* 将此关键字的下标赋值给min */ } } if (i != min) { /* 若min不等于i,说明找到最小值,交换 */ int tmp = bc27 a[min]; a[min] = a[i]; a[i] = tmp; } } }
**快速排序**
public static void quickSort(int[]n ,int left,int right){ int pivot; if (left < right) { //pivot作为枢轴,较之小的元素在左,较之大的元素在右 pivot = partition(n, left, right); //对左右数组递归调用快速排序,直到顺序完全正确 quickSort(n, left, pivot - 1); quickSort(n, pivot + 1, right); } } public static int partition(int[]n ,int left,int right){ int pivotkey = n[left]; //枢轴选定后永远不变,最终在中间,前小后大 while (left < right) { while (left < right && n[right] >= pivotkey) --right; //将比枢轴小的元素移到低端,此时right位相当于空,等待低位比pivotkey大的数补上 n[left] = n[right]; while (left < right && n[left] <= pivotkey) ++left; //将比枢轴大的元素移到高端,此时left位相当于空,等待高位比pivotkey小的数补上 n[right] = n[left]; } //当left == right,完成一趟快速排序,此时left位相当于空,等待pivotkey补上 n[left] = pivotkey; return left; }
**堆排序**
public class HeapSort { public static void main(String[] args) { int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2, -3 }; heapSort(array); } public static void heapSort(int[] array) { if (array == null || array.length <= 1) { return; } buildMaxHeap(array); //构建 for (int i = array.length - 1; i >= 1; i--) { // ArrayUtils.exchangeElements(array, 0, i); //最大交换到最后 maxHeap(array, i, 0); //调整 } } //构建 private static void buildMaxHeap(int[] array) { if (array == null || array.length <= 1) { return; } int half = array.length / 2; for (int i = half; i >= 0; i--) { maxHeap(array, array.length, i); } } //调整 private static void maxHeap(int[] array, int heapSize, int index) { int left = index * 2 + 1; int right = index * 2 + 2; int largest = index; if (left < heapSize && array[left] > array[index]) { largest = left; } if (right < heapSize && array[right] > array[largest]) { largest = right; } if (index != largest) { ArrayUtils.exchangeElements(array, index, largest); maxHeap(array, heapSize, largest); } } }
**归并排序**
public class MergeSort { /** * 归并排序 * 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列 * 时间复杂度为O(nlogn) * 稳定排序方式 * @param nums 待排序数组 * @return 输出有序数组 */
public static int[] sort(int[] nums, int low, int high) { int mid = (low + high) / 2; if (low < high) { // 左边 sort(nums, low, mid); // 右边 sort(nums, mid + 1, high); // 左右归并 merge(nums, low, mid, high); } return nums; } public static void merge(int[] nums, int low, int mid, int high) { int[] temp = new int[high - low + 1]; int i = low; // 左指针 int j = mid + 1;// 右指针 int k = 0; // 把较小的数先移到新数组中 while (i <= mid && j <= high) { if (nums[i] < nums[j]) { temp[k++] = nums[i++]; } else { temp[k++] = nums[j++]; } } // 把左边剩余的数移入数组 while (i <= mid) { temp[k++] = nums[i++]; } // 把右边边剩余的数移入数组 while (j <= high) { temp[k++] = nums[j++]; } // 把新数组中的数覆盖nums数组 for (int k2 = 0; k2 < temp.length; k2++) { nums[k2 + low] = temp[k2]; } } // 归并排序的实现 public static void main(String[] args) { int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 4 }; MergeSort.sort(nums, 0, nums.length-1); System.out.println(Arrays.toString(nums)); } }
**基数排序**
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- JavaScript演示排序算法
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树