排序都有哪几种方法?请列举。用JAVA实现一个快速排序


Posted in 面试题 onFebruary 16, 2014
排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)
用Java语言实现的各种排序,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序、SortUtil等。
插入排序:
package org.rut.util.algorithm.support;
import org.rut.util.algorithm.SortUtil;
/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class InsertSort implements SortUtil.Sort{
/* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int temp;
for(int i=1;i for(int j=i;(j>0)&&(data[j] SortUtil.swap(data,j,j-1);
}
}
}
}
冒泡排序:
package org.rut.util.algorithm.support;
import org.rut.util.algorithm.SortUtil;
/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class BubbleSort implements SortUtil.Sort{
/* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int temp;
for(int i=0;i for(int j=data.length-1;j>i;j–){
if(data[j] SortUtil.swap(data,j,j-1);
}
}
}
}
}
选择排序:
package org.rut.util.algorithm.support;
import org.rut.util.algorithm.SortUtil;
/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class SelectionSort implements SortUtil.Sort {
/*
* (non-Javadoc)
*
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int temp;
for (int i = 0; i int lowIndex = i;
for (int j = data.length – 1; j > i; j–) {
if (data[j] lowIndex = j;
}
}
SortUtil.swap(data,i,lowIndex);
}
}
}
Shell排序:
package org.rut.util.algorithm.support;
import org.rut.util.algorithm.SortUtil;
/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class ShellSort implements SortUtil.Sort{
/* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
for(int i=data.length/2;i>2;i/=2){
for(int j=0;j insertSort(data,j,i);
}
}
insertSort(data,0,1);
}
/**
* @param data
* @param j
* @param i
*/
private void insertSort(int[] data, int start, int inc) {
int temp;
for(int i=start+inc;i for(int j=i;(j>=inc)&&(data[j] SortUtil.swap(data,j,j-inc);
}
}
}
}
快速排序:
package org.rut.util.algorithm.support;
import org.rut.util.algorithm.SortUtil;
/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class QuickSort implements SortUtil.Sort{
/* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
quickSort(data,0,data.length-1);
}
private void quickSort(int[] data,int i,int j){
int pivotIndex=(i+j)/2;
//swap
SortUtil.swap(data,pivotIndex,j);

int k=partition(data,i-1,j,data[j]);
SortUtil.swap(data,k,j);
if((k-i)>1) quickSort(data,i,k-1);
if((j-k)>1) quickSort(data,k+1,j);

}
/**
* @param data
* @param i
* @param j
* @return
*/
private int partition(int[] data, int l, int r,int pivot) {
do{
while(data[++l] while((r!=0)&&data[--r]>pivot);
SortUtil.swap(data,l,r);
}
while(l SortUtil.swap(data,l,r);
return l;
}

}

改进后的快速排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class ImprovedQuickSort implements SortUtil.Sort {

private static int MAX_STACK_SIZE=4096;
private static int THRESHOLD=10;
/* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int[] stack=new int[MAX_STACK_SIZE];

int top=-1;
int pivot;
int pivotIndex,l,r;

stack[++top]=0;
stack[++top]=data.length-1;

while(top>0){
int j=stack[top--];
int i=stack[top--];

pivotIndex=(i+j)/2;
pivot=data[pivotIndex];

SortUtil.swap(data,pivotIndex,j);

//partition
l=i-1;
r=j;
do{
while(data[++l] while((r!=0)&&(data[--r]>pivot));
SortUtil.swap(data,l,r);
}
while(l SortUtil.swap(data,l,r);
SortUtil.swap(data,l,j);

if((l-i)>THRESHOLD){
stack[++top]=i;
stack[++top]=l-1;
}
if((j-l)>THRESHOLD){
stack[++top]=l+1;
stack[++top]=j;
}

}
//new InsertSort().sort(data);
insertSort(data);
}
/**
* @param data
*/
private void insertSort(int[] data) {
int temp;
for(int i=1;i for(int j=i;(j>0)&&(data[j] SortUtil.swap(data,j,j-1);
}
}
}

}

归并排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class MergeSort implements SortUtil.Sort{

/* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int[] temp=new int[data.length];
mergeSort(data,temp,0,data.length-1);
}

private void mergeSort(int[] data,int[] temp,int l,int r){
int mid=(l+r)/2;
if(l==r) return ;
mergeSort(data,temp,l,mid);
mergeSort(data,temp,mid+1,r);
for(int i=l;i temp[i]=data[i];
}
int i1=l;
int i2=mid+1;
for(int cur=l;cur if(i1==mid+1)
data[cur]=temp[i2++];
else if(i2>r)
data[cur]=temp[i1++];
else if(temp[i1] data[cur]=temp[i1++];
else
data[cur]=temp[i2++];
}
}

}

改进后的归并排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class ImprovedMergeSort implements SortUtil.Sort {

private static final int THRESHOLD = 10;

/*
* (non-Javadoc)
*
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
int[] temp=new int[data.length];
mergeSort(data,temp,0,data.length-1);
}

private void mergeSort(int[] data, int[] temp, int l, int r) {
int i, j, k;
int mid = (l + r) / 2;
if (l == r)
return;
if ((mid – l) >= THRESHOLD)
mergeSort(data, temp, l, mid);
else
insertSort(data, l, mid – l + 1);
if ((r – mid) > THRESHOLD)
mergeSort(data, temp, mid + 1, r);
else
insertSort(data, mid + 1, r – mid);

for (i = l; i temp[i] = data[i];
}
for (j = 1; j temp[r - j + 1] = data[j + mid];
}
int a = temp[l];
int b = temp[r];
for (i = l, j = r, k = l; k if (a data[k] = temp[i++];
a = temp[i];
} else {
data[k] = temp[j--];
b = temp[j];
}
}
}

/**
* @param data
* @param l
* @param i
*/
private void insertSort(int[] data, int start, int len) {
for(int i=start+1;i for(int j=i;(j>start) && data[j] SortUtil.swap(data,j,j-1);
}
}
}

}

堆排序:

package org.rut.util.algorithm.support;

import org.rut.util.algorithm.SortUtil;

/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class HeapSort implements SortUtil.Sort{

/* (non-Javadoc)
* @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
*/
public void sort(int[] data) {
MaxHeap h=new MaxHeap();
h.init(data);
for(int i=0;i h.remove();
System.arraycopy(h.queue,1,data,0,data.length);
}

private static class MaxHeap{

void init(int[] data){
this.queue=new int[data.length+1];
for(int i=0;i queue[++size]=data[i];
fixUp(size);
}
}

private int size=0;

private int[] queue;

public int get() {
return queue[1];
}

public void remove() {
SortUtil.swap(queue,1,size–);
fixDown(1);
}
//fixdown
private void fixDown(int k) {
int j;
while ((j = k if (j j++;
if (queue[k]>queue[j]) //不用交换
break;
SortUtil.swap(queue,j,k);
k = j;
}
}
private void fixUp(int k) {
while (k > 1) {
int j = k >> 1;
if (queue[j]>queue[k])
break;
SortUtil.swap(queue,j,k);
k = j;
}
}

}

}

SortUtil:

package org.rut.util.algorithm;

import org.rut.util.algorithm.support.BubbleSort;
import org.rut.util.algorithm.support.HeapSort;
import org.rut.util.algorithm.support.ImprovedMergeSort;
import org.rut.util.algorithm.support.ImprovedQuickSort;
import org.rut.util.algorithm.support.InsertSort;
import org.rut.util.algorithm.support.MergeSort;
import org.rut.util.algorithm.support.QuickSort;
import org.rut.util.algorithm.support.SelectionSort;
import org.rut.util.algorithm.support.ShellSort;

/**
* @author treeroot
* @since 2006-2-2
* @version 1.0
*/
public class SortUtil {
public final static int INSERT = 1;
public final static int BUBBLE = 2;
public final static int SELECTION = 3;
public final static int SHELL = 4;
public final static int QUICK = 5;
public final static int IMPROVED_QUICK = 6;
public final static int MERGE = 7;
public final static int IMPROVED_MERGE = 8;
public final static int HEAP = 9;

public static void sort(int[] data) {
sort(data, IMPROVED_QUICK);
}
private static String[] name={
“insert”, “bubble”, “selection”, “shell”, “quick”, “improved_quick”, “merge”, “improved_merge”, “heap”
};

private static Sort[] impl=new Sort[]{
new InsertSort(),
new BubbleSort(),
new SelectionSort(),
new ShellSort(),
new QuickSort(),
new ImprovedQuickSort(),
new MergeSort(),
new ImprovedMergeSort(),
new HeapSort()
};

public static String toString(int algorithm){
return name[algorithm-1];
}

public static void sort(int[] data, int algorithm) {
impl[algorithm-1].sort(data);
}

public static interface Sort {
public void sort(int[] data);
}

public static void swap(int[] data, int i, int j) {
int temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}

Tags in this post...

面试题 相关文章推荐
枚举和一组预处理的#define有什么不同
Sep 21 面试题
"引用"与多态的关系
Feb 01 面试题
Net Remoting把服务器端激活两种模式
Jan 22 面试题
可靠的数据流传输TCP
Mar 15 面试题
介绍一下MD5加密算法
Nov 12 面试题
linux下进程间通信的方式
Dec 23 面试题
Linux的文件类型
Jul 05 面试题
Linux如何修改文件和文件夹的权限
Jun 27 面试题
飞利信loadrunner和软件测试笔试题
Sep 22 面试题
介绍一下Python中webbrowser的用法
May 07 面试题
如何用Java判断一个文件或目录是否存在
Nov 19 面试题
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
Oct 07 面试题
编程输出如下图形
Nov 24 #面试题
你在项目中用到了xml技术的哪些方面?如何实现的?
Jan 26 #面试题
编程用JAVA解析XML的方式
Jul 07 #面试题
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
Jan 12 #面试题
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
Apr 13 #面试题
介绍下Java中==和equals的区别
Sep 01 #面试题
两道JAVA笔试题
Sep 14 #面试题
You might like
php中的数组操作函数整理
2008/08/18 PHP
php封装的smarty类完整实例
2016/10/19 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
JS中eval函数的使用示例
2013/07/21 Javascript
Javascript的&&和||的另类用法
2014/07/23 Javascript
jQuery模拟新浪微博首页滚动效果的方法
2015/03/11 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
JS实现的简单图片切换功能示例【测试可用】
2017/02/14 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
微信小程序实现的涂鸦功能示例【附源码下载】
2018/01/12 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
2019/08/11 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
2019/12/10 Javascript
python3解析库pyquery的深入讲解
2018/06/26 Python
python实现京东秒杀功能
2018/07/30 Python
对numpy中的where方法嵌套使用详解
2018/10/31 Python
在pytorch 中计算精度、回归率、F1 score等指标的实例
2020/01/18 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
Python如何读取、写入CSV数据
2020/07/28 Python
Mamaearth官方网站:印度母婴护理产品公司
2019/10/06 全球购物
护士辞职信范文
2014/01/19 职场文书
小学生暑假感言
2014/02/06 职场文书
2014新课程改革心得体会
2014/03/10 职场文书
国际金融专业自荐信
2014/07/05 职场文书
调研汇报材料范文
2014/08/17 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
任长霞观后感
2015/06/16 职场文书
安全教育第一课观后感
2015/06/17 职场文书
工作服管理制度范本
2015/08/06 职场文书
element tree树形组件回显数据问题解决
2022/08/14 Javascript