java实现快速排序算法
void paixu(int a[],int low,int high;)//用快速排序法
{
// low, high表示扫描的范围
int pivot;//存放中心索引及其值的局部变量
int scanup,scandown,mid;//用于扫描的索引
if (high-low<=0) //如果数组中的元素少于两个,则返回
return;
else
if(high-low==1) //如果有两个元素,对其进行比较
{
if(apai[high]<apai[low]) //如果后一个比前一个小,
Swap(apai[low],apai[high]);//那么交换位置
return;
}//end if
mid=(low+high)/2;//取得中心索引
pivot=apai[mid];//将中间索引的值,赋给pivot
Swap(apai[mid],apai[low]);//交换pivot及低端元素的值
Scanup=low+1;
Scandown=high;//初始化扫描索引scanup和scandown
do{
//从低端子表向上扫描,当scanup进入高端子表或遇到大于pivot的元素时结束.
while(scanup<=scandown && apai[scanup]<=pivot)
scanup++;
//从高端子表向下扫描,当scandown遇到小于或等于pivot的元素时结束
while(piovt<apai[scandown])
scandown--;
//如果两个索引还在各自的子表中,则表示两个元素错位,将两个元素换位
if(scanup<scandown)
Swap(apai[scanup],apai[scandown]);
}while(scanup<scandown);
//将pivot拷贝到scandown位置,分开两个子表
apai[low]=apai[scandown];
apai[scandown]=pivot;
//如果低端子表(low至scandown-1)有2个或更多个元素,则进行递归调用
if(low<scandown-1)
paixu(apai,low,scandown-1);
//如果高端子表(scandown+1至high) 有2个或更多个元素,则进行递归调用
if(scandown+1<high)
paixu(apai, scandown+1, high);
}
其他排序:
import java.io.*;
interface Item
{
public boolean less(Item v);
}
class Recod
{
int id;
String name;
double balance;
static int flag=2;
}
class Sort
{
static boolean less(Item v,Item w)
{
return v.less(w);
}
static void compExch(Item a[],int i,int j)
{
if(less(a[i],a[j]))
exch(a,i,j);
}
static void exch(Item a[],int i,int j)
{
Item t=a[i]; a[i]=a[j]; a[j]=t;
}
//选择排序
static void selSort(Item a[],int l,int r)
{
for(int i=l;i<=r;i++)
{
int max=i;
for(int j=i+1;j<=r;j++)
{
if(less(a[max],a[j])) max=j;
}
if(max!=i)
exch(a,i,max);
}
}
//冒泡
static void maoSort(Item a[],int l,int r)
{
for(int i=l;i<=r;i++)
{
int flag=1;
for(int j=r;j>i;j--)
{
if(less(a[j-1],a[j]))
{
exch(a,j-1,j);
flag=0;
}
}
if(flag==1) break;
}
}
//插入
static void insertSort(Item a[],int l,int r)
{
Item item;
int j=0;
for(int i=1+l;i<=r;i++)
{
item=a[i];
j=i-1;
while(j>=l && less(a[j],item))
{
a[j+1]=a[j];
j--;
}
a[j+1]=item;
}
}
//快排(三路取中加小文件截断)
static void quickSort(Item a[],int l,int r)
{
if((r-l)<=10) insertSort(a,l,r);
else
{
if(l<r)
{
int i=l,j=r,k=(l+r)/2;
compExch(a,r,k);
compExch(a,r,l);
compExch(a,k,l);
exch(a,k,l);
Item item=a[i];
while(i!=j)
{
while(i<j && less(a[j],item))
j--;
if(i<j)
{
a[i]=a[j];
i++;
}
while(i<j && less(item,a[i]))
i++;
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=item;
quickSort(a,l,i-1);
quickSort(a,i+1,r);
}
}
}
//希尔排序
static void shellSort(Item a[],int l,int r)
{
int d=r/2;
Item item;
while(d>0)
{
for(int i=d;i<=r;i++)
{
int j=i-d;
while(j>=l && less(a[j],a[j+d]))
{
item=a[j];
a[j]=a[j+d];
a[j+d]=item;
j=j-d;
}
}
d=d/2;
}
}
}
public class Quick extends Recod implements Item
{
public boolean less(Item v)
{
Quick qu=(Quick)v;
switch(flag)
{
case 2: return id<qu.id;
case 1: return name.compareTo(qu.name)<0;
default:return balance<qu.balance;
}
}
public static void main(String[]args)
{
Quick a[]=new Quick[2000];
for(int i=0;i<2000;i++)
{
a[i]=new Quick();
a[i].id=(int)(1+Math.round(Math.random()*100));
a[i].name="ren"+String.valueOf(i);
a[i].balance=10+Math.random()*100;
System.out.println(a[i].id+" "+a[i].balance);
}
Sort.quickSort(a,0,1999);
System.out.println("**************");
if(flag==2)
for(int j=0;j<2000;j++)
{
System.out.println(a[j].id+" "+a[j].name);
}
else
{
for(int j=0;j<2000;j++)
System.out.println(a[j].balance+" "+a[j].name);
}
}
}
{
// low, high表示扫描的范围
int pivot;//存放中心索引及其值的局部变量
int scanup,scandown,mid;//用于扫描的索引
if (high-low<=0) //如果数组中的元素少于两个,则返回
return;
else
if(high-low==1) //如果有两个元素,对其进行比较
{
if(apai[high]<apai[low]) //如果后一个比前一个小,
Swap(apai[low],apai[high]);//那么交换位置
return;
}//end if
mid=(low+high)/2;//取得中心索引
pivot=apai[mid];//将中间索引的值,赋给pivot
Swap(apai[mid],apai[low]);//交换pivot及低端元素的值
Scanup=low+1;
Scandown=high;//初始化扫描索引scanup和scandown
do{
//从低端子表向上扫描,当scanup进入高端子表或遇到大于pivot的元素时结束.
while(scanup<=scandown && apai[scanup]<=pivot)
scanup++;
//从高端子表向下扫描,当scandown遇到小于或等于pivot的元素时结束
while(piovt<apai[scandown])
scandown--;
//如果两个索引还在各自的子表中,则表示两个元素错位,将两个元素换位
if(scanup<scandown)
Swap(apai[scanup],apai[scandown]);
}while(scanup<scandown);
//将pivot拷贝到scandown位置,分开两个子表
apai[low]=apai[scandown];
apai[scandown]=pivot;
//如果低端子表(low至scandown-1)有2个或更多个元素,则进行递归调用
if(low<scandown-1)
paixu(apai,low,scandown-1);
//如果高端子表(scandown+1至high) 有2个或更多个元素,则进行递归调用
if(scandown+1<high)
paixu(apai, scandown+1, high);
}
其他排序:
import java.io.*;
interface Item
{
public boolean less(Item v);
}
class Recod
{
int id;
String name;
double balance;
static int flag=2;
}
class Sort
{
static boolean less(Item v,Item w)
{
return v.less(w);
}
static void compExch(Item a[],int i,int j)
{
if(less(a[i],a[j]))
exch(a,i,j);
}
static void exch(Item a[],int i,int j)
{
Item t=a[i]; a[i]=a[j]; a[j]=t;
}
//选择排序
static void selSort(Item a[],int l,int r)
{
for(int i=l;i<=r;i++)
{
int max=i;
for(int j=i+1;j<=r;j++)
{
if(less(a[max],a[j])) max=j;
}
if(max!=i)
exch(a,i,max);
}
}
//冒泡
static void maoSort(Item a[],int l,int r)
{
for(int i=l;i<=r;i++)
{
int flag=1;
for(int j=r;j>i;j--)
{
if(less(a[j-1],a[j]))
{
exch(a,j-1,j);
flag=0;
}
}
if(flag==1) break;
}
}
//插入
static void insertSort(Item a[],int l,int r)
{
Item item;
int j=0;
for(int i=1+l;i<=r;i++)
{
item=a[i];
j=i-1;
while(j>=l && less(a[j],item))
{
a[j+1]=a[j];
j--;
}
a[j+1]=item;
}
}
//快排(三路取中加小文件截断)
static void quickSort(Item a[],int l,int r)
{
if((r-l)<=10) insertSort(a,l,r);
else
{
if(l<r)
{
int i=l,j=r,k=(l+r)/2;
compExch(a,r,k);
compExch(a,r,l);
compExch(a,k,l);
exch(a,k,l);
Item item=a[i];
while(i!=j)
{
while(i<j && less(a[j],item))
j--;
if(i<j)
{
a[i]=a[j];
i++;
}
while(i<j && less(item,a[i]))
i++;
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=item;
quickSort(a,l,i-1);
quickSort(a,i+1,r);
}
}
}
//希尔排序
static void shellSort(Item a[],int l,int r)
{
int d=r/2;
Item item;
while(d>0)
{
for(int i=d;i<=r;i++)
{
int j=i-d;
while(j>=l && less(a[j],a[j+d]))
{
item=a[j];
a[j]=a[j+d];
a[j+d]=item;
j=j-d;
}
}
d=d/2;
}
}
}
public class Quick extends Recod implements Item
{
public boolean less(Item v)
{
Quick qu=(Quick)v;
switch(flag)
{
case 2: return id<qu.id;
case 1: return name.compareTo(qu.name)<0;
default:return balance<qu.balance;
}
}
public static void main(String[]args)
{
Quick a[]=new Quick[2000];
for(int i=0;i<2000;i++)
{
a[i]=new Quick();
a[i].id=(int)(1+Math.round(Math.random()*100));
a[i].name="ren"+String.valueOf(i);
a[i].balance=10+Math.random()*100;
System.out.println(a[i].id+" "+a[i].balance);
}
Sort.quickSort(a,0,1999);
System.out.println("**************");
if(flag==2)
for(int j=0;j<2000;j++)
{
System.out.println(a[j].id+" "+a[j].name);
}
else
{
for(int j=0;j<2000;j++)
System.out.println(a[j].balance+" "+a[j].name);
}
}
}