将算法导论的实验记录在这。。。
《算法导论》第七章 快速排序 Java实现,并比较性能
快速排序的描述:
分解:数组A[p...r]被划分成两个子数组A[p...q-1]和A[q+1...r],使得A[p...q-1]中的每个元素都小于等于A[]q],且小于等于A[q+1...r]中的元素。下标q也在这个划分过程中进行计算。
解决:通过递归调用快速排序,对子数组排序
合并:因为两个子数组是就地排序的,将他们的合并不需要操作,整个数组已有序。
<strong>//以最后一个元素为基准</strong>,<strong>排序20次取平均时间</strong><pre name="code" class="java">import java.util.Scanner;
import java.util.Date;
public class quicksort {
private static Scanner sc;
static int t=20;
public static void main(String[] args) {
// TODO Auto-generated method stub
// int[] a={2,8,7,1,3,5,6,4};
sc = new Scanner(System.in);
System.out.println("请输入待排序数组长度:");
int len=sc.nextInt();
int[] a = new int[len];
for(int k=0; k<len; k++){
a[k] = (int)Math.floor(Math.random()*200);
}
System.out.println("待排序数列:");
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
System.out.println();
long start = new Date().getTime();
System.out.println("开始排序时间:"+start);
for(int i=1;i<=t;i++)
{
quick_sort(a,0,a.length-1);
}
System.out.println();
long end =new Date().getTime();
System.out.println("排序结束时间:"+end);
double time=(double)(end-start)/t;//取平均值
System.out.println("排序耗费时间:"+time+"ms");
System.out.println();
System.out.println("排序后数列:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
}
public static void quick_sort(int[] a,int low,int high)
{
if(low<high)
{
int q=partition(a,low,high);
quick_sort(a,low,q-1);
quick_sort(a,q+1,high);
}
}
private static int partition(int[] a,int low,int high){
int x=a[high];//基准元素
int i=low-1;
for(int j=low;j<=high-1;j++)
{
if(a[j]<=x){
i++;
exchangeElements(a,i,j);}
}
exchangeElements(a,i+1,high);
return i+1;
}
public static void exchangeElements(int[] array, int index1, int index2) {
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
}
<pre name="code" class="java">import java.util.Date;
import java.util.Scanner;
public class randomizedPartition {
private static Scanner sc;
static int t=20;
public static void main(String[] args)
{
sc = new Scanner(System.in);
System.out.println("请输入待排序数组长度:");
int len=sc.nextInt();
int[] a = new int[len];
for(int k=0; k<len; k++){
a[k] = (int)Math.floor(Math.random()*200);
}
System.out.println("待排序数列:");
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+" ");
}
System.out.println();
long start = new Date().getTime();
System.out.println("开始排序时间:"+start);
for(int i=1;i<=t;i++)
{
random_quicksort(a,0,a.length-1);
}
long end =new Date().getTime();
System.out.println("排序结束时间:"+end);
double time=(double)(end-start)/t;//取平均值
System.out.println("randomizedPartition排序耗费时间:"+time+"ms");
System.out.println("排序后数列:");
for (int i = 0; i < a.length; i++)
{
System.out.print(a[i]+" ");
}
}
public static void random_quicksort(int[] a,int p,int r)
{
if(p<r)
{
int k = (int) (p + Math.random()%(r-p+1));
exchangeElements(a,k,r);
int q=partition(a,p,r);
random_quicksort(a,p,q-1);
random_quicksort(a,q+1,r);
}
}
private static int partition(int[] a,int p,int r){
int x=a[r];//基准元素
int i=p-1;
for(int j=p;j<=r-1;j++)
{
if(a[j]<=x){
i++;
exchangeElements(a,i,j);}
}
exchangeElements(a,i+1,r);
return i+1;
}
public static void exchangeElements(int[] array, int index1, int index2) {
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
}
性能比较
以上,随机快速排序的性能要优于普通快速排序