常见排序算法总结
来源:互联网 发布:mac用minila 编辑:程序博客网 时间:2024/05/21 17:26
1. 冒泡排序
普通版:
public static void bubbleSort(int[] nums){ int len = nums.length; for(int i = 0; i < len - 1; i++){ for(int j = 0; j < len - 1 - i; j++){ if(nums[j + 1] < nums[j]){ int tmp = nums[j + 1]; nums[j + 1] = nums[j]; nums[j] = tmp; } } }}
改良版:
public static void bubbleSortUpdated(int[] nums){ int len = nums.length; boolean flag = true; while(flag){ flag = false; for(int j = 0; j < len - 1; j++){ if(nums[j + 1] < nums[j]){ int tmp = nums[j + 1]; nums[j + 1] = nums[j]; nums[j] = tmp; flag = true; } } }}
2. 堆排序:
public static void heapSort(int[] nums){ int len = nums.length; //循环建堆 for(int i = 0; i < len - 1; i++){ buildMaxHeap(nums, len - 1 - i); swap(nums, 0, len - 1 - i); }} //建堆private static void buildMaxHeap(int[] nums, int lastIndex){ //从lastIndex处节点(最后一个节点)的父节点开始 for(int i = (lastIndex - 1) / 2; i >= 0; i--){ int k = i; //k保存正在判断的节点 //如果当前k节点的子节点存在 while(k * 2 + 1 <= lastIndex){ int biggerIndex = 2 * k + 1; //k节点的左子节点的索引 //如果biggerIndex小于lastIndex,即biggerIndex+1代表的k节点的右子节点存在 if(biggerIndex < lastIndex){ //如果右子节点的值较大 if(nums[biggerIndex] < nums[biggerIndex + 1]){ biggerIndex++; //biggerIndex总是记录较大子节点的索引 } } //如果k节点的值小于其较大的子节点的值 if(nums[k] < nums[biggerIndex]){ swap(nums, k, biggerIndex); //交换他们 //将biggerIndex赋予k,开始while的下一次循环,重新保证k节点的值大于其左右子节点的值 k = biggerIndex; }else{ break; } } }}//交换private static void swap(int[] nums, int i, int j){ int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp;}
3. 插入排序
public static void insertSort(int[] nums){ int len = nums.length; int tmp, j; for(int i = 0; i < len; i++){ tmp = nums[i]; //每次都把新值赋给tmp for(j = i; j > 0 && tmp < nums[j - 1]; j--){ nums[j] = nums[j - 1]; } nums[j] = tmp; }}
4. 归并排序
public static int[] mergeSort(int[] nums, int low, int high){ int mid = (high + low) / 2; if(low < high){ mergeSort(nums, low, mid); mergeSort(nums, mid + 1, high); merge(nums, low, mid, high); } return nums;}private static void merge(int[] nums, int low, int mid, int high){ int[] tmp = 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]){ tmp[k++] = nums[i++]; }else{ tmp[k++] = nums[j++]; } } //左边剩余的数移入新数组 while(i <= mid){ tmp[k++] = nums[i++]; } //右边剩余的数移入新数组 while(j <= high){ tmp[k++] = nums[j++]; } //新数组覆盖nums数组 for(int m = 0; m < tmp.length; m++){ nums[m + low] = tmp[m]; }}
5. 快速排序
第一种:
public static void quickSort(int[] nums, int low, int high){ if(low < high){ int key = nums[low]; int i = low, j; for(j = low + 1; j <= high; j++){ if(nums[j] < key){ int tmp = nums[j]; nums[j] = nums[i + 1]; nums[i + 1] = tmp; i++; } } nums[low] = nums[i]; nums[i] = key; quickSort(nums, low, i - 1); quickSort(nums, i + 1, high); }}
第二种:
public static int getMiddle(int[] nums, int low, int high){ int tmp = nums[low]; while(low < high){ while(low < high && nums[high] >= tmp){ high--; } nums[low] = nums[high]; while(low < high && nums[low] <= tmp){ low++; } nums[high] = nums[low]; } nums[low] = tmp; return low;}public static void quickSort2(int[] nums, int low, int high){ if(low < high){ int middle = getMiddle(nums, low, high); quickSort2(nums, low, middle - 1); quickSort2(nums, middle + 1, high); }}
6. 选择排序
public static void selectSort(int[] nums){ int len = nums.length; for(int i = 0; i < len; i++){ int k = i; for(int j = i + 1; j < len; j++){ if(nums[j] < nums[k]){ k = j; } } int tmp = nums[i]; nums[i] = nums[k]; nums[k] = tmp; }}
7. 希尔排序
public static void shellSort(int[] nums){ int j = 0; int tmp = 0; for(int increment = nums.length / 2; increment > 0; increment /= 2){ for(int i = increment; i < nums.length; i++){ tmp = nums[i]; for(j = i; j >= increment; j -= increment){ if(tmp < nums[j - increment]){ nums[j] = nums[j - increment]; } else{ break; } nums[j] = tmp; } } }}
各种排序算法的时间复杂度和稳定性:
阅读全文
1 0
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结 .
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- 常见排序算法总结
- BZOJ2006 [NOI2010] ST表 + 堆
- Linux bash 编程
- HTTP协议
- usb协议包概述
- 15个最受欢迎的Python开源框架
- 常见排序算法总结
- python列表推导式
- 注意!!变量在变化!!
- 剑指offer:合并两个排序的链表
- 2017
- JSP中的相对路径和绝对路径
- bzoj1296 [SCOI2009]粉刷匠 分组背包/单调队列优化
- Ubuntu下LaTeX+vim安装与使用
- HDU 4745 Two Rabbits【非连续最长回文子序列,区间DP】