数据结构之排序
2016-03-01 17:05
281 查看
<span style="font-size:18px;">package com.small; /** * 注意a[0]是否有意思,书上c语言基本都是将a[0]作为哨兵,那么0号元素不能用,我这里全部是flag代替 * @author small leaf * */ public class Sort { /** * 直接插入排序 */ public static void insertSort(int a[]){ int i,j,flag; for(i=1;i<a.length;i++){ if(a[i]<a[i-1]){ flag=a[i]; for(j=i-1;flag<a[j];j--){ a[j+1]=a[j]; } a[j+1]=flag; } } } /** * 折半插入 */ public static void midInsertSort(int a[]){ int i,j,low,high,mid,flag; for(i=1;i<a.length;i++){ flag=a[i]; low=0; high=i-1; while(low<=high){ mid=(low+high)/2; if(a[mid]>flag){ high=mid-1; }else{ low=mid+1; } } for(j=i-1;j>=high+1;j--){ a[j+1]=a[j]; } a[high+1]=flag; } } /** * 希尔排序 */ public static void shellSort(int a[]){ int i,dk,j,flag; int len=a.length; for(dk=len/2;dk>=1;dk=dk/2){ for(i=dk+1;i<len;i++){ if(a[i]<a[i-dk]){ flag=a[i]; for(j=i-dk;j>0&&flag<a[j];j-=dk){ a[j+dk]=a[j]; } a[j+dk]=flag; } } } } /** * 冒泡排序 */ public static void bubbleSort(int a[]){ int i,j; boolean flag; int temp; int len=a.length; for(i=0;i<len-1;i++){ flag=false; for(j=len-1;j>i;j--){ if(a[j-1]>a[j]){ temp=a[j]; a[j]=a[j-1]; a[j-1]=temp; flag=true; } } if(!flag){ return ; } } } /** * 快速排序 */ public static void quickSort(int a[],int low,int high){ if(low<high){ int divide=partition(a, low, high); quickSort(a, low, divide-1); quickSort(a, divide+1, high); } } public static int partition(int a[],int low,int high){ int flag=a[low]; while(low<high){ while(low<high&&a[high]>flag){ high--; } a[low]=a[high]; while(low<high&&a[low]<flag){ low++; } a[high]=a[low]; } a[low]=flag; return low; } /** * 向下调整 * @param a * @param k 调整的根节点 * @param len */ public static void adjustDown(int a[],int k,int len){ int flag=a[k-1]; for(int i=2*k;i<=len;i*=2){ if(i<len&&a[i-1]<a[i]){ i++; } if(flag>a[i-1]) break; else{ a[k-1]=a[i-1]; k=i; } } a[k-1]=flag; } /** * 建立大根堆 * @param a * @param len */ public static void buildMaxHeap(int a[],int len){ for(int i=len/2;i>0;i--){ adjustDown(a, i, len); } } /** * 堆排序 * @param a * @param len */ public static void heapSort(int a[],int len){ buildMaxHeap(a, len); int flag; for(int i=len;i>0;i--){ flag=a[i-1]; a[i-1]=a[0]; a[0]=flag; adjustDown(a, 1, i-1); } } /** * 两两归并 * @param a[low....mid] a[mid+1....high] 两个表中元素已经有序了 * @param low * @param mid * @param high */ public static void merge(int a[],int low,int mid,int high){ int i,j,k; int[] b=new int[a.length];//不能 int[] b=a;这样b引用a指向了a的地址 for(i=0;i<a.length;i++){ b[i]=a[i]; } for(i=low,j=mid+1,k=i;i<=mid&&j<=high;k++){ if(b[i]<b[j]){ a[k]=b[i++]; }else{ a[k]=b[j++]; } } while(i<=mid) a[k++]=b[i++];//第一个表没有检测完 即将表全部加入进去 while(j<=high) a[k++]=b[j++];//第一个表没有检测完 即将表全部加入进去 } /** * 归并排序 */ public static void mergeSort(int a[],int low,int high){ if(low<high){ int mid=(low+high)/2; mergeSort(a, low, mid); mergeSort(a, mid+1, high); merge(a, low, mid, high); } } } </span>
相关文章推荐
- VBA教程初级(二):数据结构
- 《数据结构》只设置尾指针而不设置头指针的讯循环链表的合并
- 剑指offer之数据结构
- 【数据结构】复杂链表的复制
- 大话数据结构
- [地图开发][算法及数据结构]四叉树原理
- [数据结构]Stack(数组)实现
- php数组的数据结构
- IOS底层数据结构--class
- 数据结构(14)--线索二叉树的实现
- 数据结构——算法之(041)(寻找数组中的最大值和最小值)
- python,数据结构
- POJ3580[memo] 旋转吧,splay!
- java 数据结构和存储方式
- 2015年大二上-数据结构-图-2-(2)-Kruskal算法
- 数组和广义表-第5章-《数据结构题集》习题解析-严蔚敏吴伟民版
- 5-6-广义表(扩展线性链表存储表示)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版
- 5-5-广义表(头尾链表存储表示)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版
- java递归算法实现
- 数据结构-阶段性理解