您的位置:首页 > 理论基础 > 数据结构算法

数据结构之排序

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: