JAVA内部排序算法汇总

为了增加面试的机会,针对公司的笔试题,特此整理一下排序方面的资料...

定义排序的接口:Sort

 public interface Sort {
 int[] datas = {0,12,32,45,2,13,57,29,11,34,21,42,15,90};
 int length =datas.length;
 public void sort();
 public void publish();
}

定义排序的抽象类: AbstractSort

public abstract class AbstractSort implements Sort{
 public void publish(){
  for(int i=1;i<length;i++){
   System.out.println(datas[i]+",");
  }
 }
}

<------直接插入排序----->

public class StraintInsertSort extends AbstractSort {

 public void sort() {
  // TODO Auto-generated method stub
  for(int i=2;i<length;i++){
   datas[0]=datas[i];
   int index = i-1;
   while(datas[index]>datas[0]){
    datas[index+1]=datas[index];
    index--;
   }
   datas[index+1]=datas[0];
  }
 }
}

<------二分查找排序------>

public class BinaryFindSort extends AbstractSort {

 public void sort() {
  // TODO Auto-generated method stub
  for(int i=2;i<length;i++){
   datas[0]=datas[i];
   int pos = find(datas[i],i-1);
   int index = i-1;
   while(index>pos){
    datas[index+1] = datas[index];
    index--;
   }
   datas[pos+1]=datas[0];
  }
 }
 private int find(int data,int end){
  int pos = 1;
  int low = 1;
  int hight = end;
  int mid = 1;
  while(low<=hight){
   mid = (low + hight)/2;
   if(datas[mid]<=data) low = mid+1;
   if(datas[mid]>data) hight = mid-1;
  }
  pos = hight;
  return pos;
 }

} 

<------选择排序-------->

public class SelectSort extends AbstractSort {

 public void sort() {
  // TODO Auto-generated method stub
  int large =0;
  int index = 1;
  for(int i=1;i<length-1;i++){
   for(int j=1;j<=length-i;j++){
    if(datas[j]>large) {
     index = j;
     large = datas[j];
    }
   }
   datas[0] = datas[length-i];
   datas[length-i] = datas[index];
   datas[index] = datas[0];
   large=0;
  }
 }
 }

 

<------堆排序------>

public class HeapSort extends AbstractSort {

 public void sort() {
  // TODO Auto-generated method stub
  createHeap();
  for(int index = length-1;index>1;){
   datas[0] = datas[index] ;
   datas[index] = datas[1];
   datas[1] = datas[0];
   fixHeap(1,--index);
  }
  
 }
 private void createHeap(){
  int parent = (length-1)/2;
  int child = parent * 2;
  for(;parent>0;parent--){
   child = parent*2;
   if((child+1)<length&&datas[child]<datas[child+1])
    child++;
   if(datas[child]>datas[parent]){
    datas[0] = datas[child];
    datas[child] = datas[parent];
    datas[parent] = datas[0];
    fixHeap(child,length-1);
   }
  }
 }
 private void fixHeap(int root,int size){
  int child = 2*root;
  if(child>size)return ;
  int large = root;
  if(child==size&&datas[child]>datas[root])
   large = child;
  else if((child+1)<=size)
   if(datas[child]<datas[child+1])
    large = child+1;
   else large = child;
  if(large!=root){
      datas[0] = datas[large];
   datas[large] = datas[root];
   datas[root] = datas[0];
   fixHeap(large,size);
  }
 }

}

<------冒泡排序------>

package org.xingji.sorts;

public class BumpSort extends AbstractSort {

 public void sort() {
  // TODO Auto-generated method stub
  boolean flag = true;
  for(int i=1;i<length-1&&flag;i++){
   flag = false;
   for(int j=1;j<length-1-i;j++){
    if(datas[j]>datas[j+1]){
     datas[0] = datas[j+1];
     datas[j+1] = datas[j];
     datas[j] = datas[0];
     flag = true;
    }
   }
  }
 }

}

<------快速排序----->

package org.xingji.sorts;

public class QuickSort extends AbstractSort {

 public void sort() {
  // TODO Auto-generated method stub
  quickSort(1,length-1);
 }
 private void quickSort(int start,int end){
  if(start<end){
   int pos = partion(start,end);
   quickSort(start,pos-1);
   quickSort(pos+1,end);
  }
 }
 private int partion(int start,int end){
  int result = 1;
  int key = datas[start];
  int low = start;
  int hight = end;
  while(low<hight){
   while(datas[hight]>=key&&low<hight) hight--;
   datas[low]=datas[hight];
   while(datas[low]<=key&&low<hight) low++;
   datas[hight] = datas[low];
  }
  datas[low] = key;
  result = low;
  return result;
 }

 }

 

<------希尔排序------>

package org.xingji.sorts;

public class ShellSort extends AbstractSort{

  public void sort() {
  // TODO Auto-generated method stub
  int[] ds={20,5,3,1};
  for(int i=0;i<ds.length;i++){
   shell(ds[i]);
  }
 }
 private void shell(int d){
  for(int i=1;i<=d;i++){
   for(int j=i;j<length;j=j+d){
    datas[0]=datas[j];
    int z=j;
    while((z-d)>=0&&datas[0]<datas[z-d]){
     datas[z]=datas[z-d];
     z=z-d;
    }
    datas[z]=datas[0];
   }
  }
  }

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值