数据结构之排序

来源:互联网 发布:人工智能类似电影 编辑:程序博客网 时间:2024/06/07 16:49
<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>


0 0
原创粉丝点击