为了增加面试的机会,针对公司的笔试题,特此整理一下排序方面的资料...
定义排序的接口: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];
}
}
}
}