数据结构--希尔排序和快速排序
Posted sun1993
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构--希尔排序和快速排序相关的知识,希望对你有一定的参考价值。
1 /*希尔排序:对插入排序的改进,其排序是按照一个增量序列来进行 2 *增量序列的个数就是排序的趟数。在任意增量K下,保证a[i]<=a[i+k] 3 *该算法的效率和增量需序列的选择有很大关系。 4 *增量序列一般规则:h = 3h + 1; 5 *希尔排序的效率总体比简单排序的好。 6 * */ 7 public class ShellSort { 8 9 public static void main(String[] args) { 10 int[] list = {6,9,2,3,5,50,30,8,7,4,23,12}; 11 displayList(list); 12 shellSort(list); 13 displayList(list); 14 } 15 16 public static void shellSort(int[] arr){ 17 int inner,outer; 18 int temp; 19 int h = 1; 20 while(h <= arr.length / 3){ 21 h = h * 3 + 1; 22 } 23 //外循环控制排序趟数 24 while(h > 0){ 25 //控制每个增量的循环 26 for(outer = h; outer < arr.length; outer++){ 27 temp = arr[outer]; 28 inner = outer; 29 30 while(inner > h - 1 && arr[inner - h] >= temp){ 31 arr[inner] = arr[inner - h]; 32 inner = inner - h; 33 } 34 arr[inner] = temp; 35 } 36 h = (h - 1) / 3; 37 } 38 } 39 40 public static void displayList(int[] arr){ 41 for(int i = 0; i < arr.length;i++){ 42 System.out.print(arr[i] + " "); 43 } 44 System.out.println(); 45 } 46 47 }
1 /*快速排序:将一个数组划分为两个子数组,递归调用自身为每个子数组进行快速排序。 2 * 注意:确定好递归终止条件right - left <= 0 3 * 每次划分组:是根据划分的思想确定出下次组的边界 4 *2.划分思想:按照序列中的某个值将序列划分为两部分,右边值全部小于该值左边的部分全部大于该值, 5 *该值的选择尽量接近该组序列的平均值.通过在设置两个指针,分别从相反的方向找到比中间值大的 6 *和比中间值小的,交换,最后将中间值放在其位置上。 7 *3.快速排序:通常来说是效率比较好的排序算法O(NlogN) 8 *4.中枢值选择关键,最好两边长度差不多比较好,假如两边差的多,将导致多的一边过多的划分 9 * 效率降低,序列无序度高效果会好点--对于随机选择的中枢值 10 * */ 11 public class QuickSort { 12 13 public static void main(String[] args) { 14 int[] list = {3,2,5,7,5,38,20,18,27,39,12}; 15 displayList(list); 16 quickSort(list); 17 displayList(list); 18 } 19 20 public static void quickSort(int[] arr){ 21 recQuickSort(0,arr.length-1,arr); 22 } 23 24 private static void recQuickSort(int left, int right,int[] arr) { 25 if(right - left <= 0){//size<=1.递归基准条件 26 return; 27 } 28 else{ 29 int pivot = arr[right]; 30 //整理一次小的在一边大的在一边,并获得下次分组的边界 31 int partition = partitionIt(left,right,pivot,arr); 32 recQuickSort(left, partition - 1, arr); 33 recQuickSort(partition + 1, right, arr); 34 } 35 36 } 37 38 public static int partitionIt(int left,int right,int pivot,int[] arr){ 39 int lefter = left - 1; //第一个元素的左边 40 int righter = right; //最后一个元素的右边 41 42 while(true){ 43 while(arr[++lefter] < pivot);//左边直到找到比中间值大的一个元素 44 45 while(righter > 0 && arr[--righter] > pivot);//右边直到找到比中间值小的一个元素 46 47 if(lefter >= righter){ 48 break; 49 } 50 else{ 51 swap(lefter,righter,arr); //交换两个元素 52 } 53 } 54 swap(lefter,right,arr); //将选定的中间值放其位置上 55 return lefter; 56 57 } 58 59 private static void swap(int lefter, int righter,int[] list) { 60 int temp = list[lefter]; 61 list[lefter] = list[righter]; 62 list[righter] = temp; 63 } 64 65 public static void displayList(int[] arr){ 66 for(int i = 0; i < arr.length;i++){ 67 System.out.print(arr[i] + " "); 68 } 69 System.out.println(); 70 } 71 72 }
以上是关于数据结构--希尔排序和快速排序的主要内容,如果未能解决你的问题,请参考以下文章
C# 各种内部排序方法的实现(直接插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序)
C# 各种内部排序方法的实现(直接插入排序希尔排序冒泡排序快速排序直接选择排序堆排序归并排序基数排序)
直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚