- 浏览: 14246 次
最新评论
JAVA排序算法(非原创)
package Sort;
class Data {
Comparable key;
Object value;
public Data() {
}
public Data(Data data){
this.key=data.key;
this.value=data.value;
}
public Data(Comparable key,Object value){
this.key=key;
this.value=value;
}
public String toString(){
return "key="+key+";"+"value="+value+";"+"\n";
}
}
Insertion.java
package Sort;
public class InsertionSort {
public InsertionSort() {
}
//直接插入排序,从下标1开始
public static void straightInsertionSort(Data[] data) {
int i, j;
for (i = 2; i <data.length; i++) {
if (data[i].key.compareTo(data[i - 1].key) < 0) {
data[0] = data[i];//复制为监视哨
for (j = i - 1; data[0].key.compareTo(data[j].key) < 0; --j) {
data[j + 1] = data[j];//记录右移
}
data[j + 1] = data[0];//插入
}
}
}
//折半插入排序,从下标1开始
public static void BinaryInsertionSort(Data[] data){
int i,j,low,high,mid;
for(i=2;i<data.length;i++){
if (data[i].key.compareTo(data[i - 1].key) < 0) {
data[0]=data[i];
//找插入位置
low=1;high=i-1;
while(low<=high){
mid =(low+high)/2;
if(data[0].key.compareTo(data[mid].key)<0) high=mid-1;
else low=mid+1;
}
//移动插入位置以后的元素
for(j=i-1;j>=high+1;j--){
data[j+1]=data[j];
}
data[high+1]=data[0];//插入
}
}
}
//表插入排序
public static void ListInsertionSort(Data[] data){
int i,j,k;
//inner class:Table
class Table{
Comparable key;
int next;
}
Table[] table=new Table[data.length];
for(i=1;i<data.length;i++){
table[i]=new Table();
table[i].key=data[i].key;
}
table[0]=new Table();
table[0].key=new Integer(Integer.MAX_VALUE);
table[0].next=1;
table[1].next=0;
for(i=2;i<data.length;i++){
for(j=0,k=table[0].next;table[k].key.compareTo(table[i].key)<=0;j=k,k=table[k].next);
table[j].next=i;
table[i].next=k;
}
Data[] newData=new Data[data.length];
int position=table[0].next;
for(i=1;i<data.length;i++){
newData[i]=data[position];
position=table[position].next;
}
//data=newData;//不知为什么不能把newData赋给data,而必须用下面的
for(i=1;i<data.length;i++){
data[i]=newData[i];
}
}
}
QuickSort.java
package Sort;
import Queue.*;
public class QuickSort {
public QuickSort() {
}
//起泡排序
public static void BubbleSort(Data[] data) {
int i, j, lastChangeIndex;
Data temp;
i = data.length - 1;
while (i > 1) {
lastChangeIndex = 1;
for (j = 1; j < i; j++) {
if (data[j + 1].key.compareTo(data[j].key) < 0) {
temp = data[j + 1];
data[j + 1] = data[j];
data[j] = temp;
lastChangeIndex = j;
}
}
i = lastChangeIndex;
}
}
//快速排序
public static void QuickSort(Data[] data) {
QSort(data, 1, data.length - 1);
}
public static void OptimizeQuickSort(Data[] data){
OQSort(data,1,data.length-1);
}
private static void QSort(Data[] data, int s, int t) {
int pivotLoc;
if (s < t) {
pivotLoc = Partition(data, s, t); //对data[1...data.length-1]进行一次划分
QSort(data, s, pivotLoc - 1); //对低子序列进行递归排序
QSort(data, pivotLoc + 1, t); //对高子序列进行递归排序
}
}
private static void OQSort(Data[] data,int s,int t){
int pivotLoc;
if(s<t){
pivotLoc=RandomPartition(data,s,t);
QSort(data, s, pivotLoc - 1); //对低子序列进行递归排序
QSort(data, pivotLoc + 1, t); //对高子序列进行递归排序
}
}
private static int RandomPartition(Data[] data,int low,int high){
//i是low
int i=(int)Math.random()*(high-low)+low;
Data temp=data[low];
data[low]=data[i];
data[i]=temp;
return Partition(data,low,high);
}
private static int Partition(Data[] data, int low, int high) {
Comparable pivotKey;
data[0] = data[low];
pivotKey = data[low].key; //枢轴
while (low < high) {
while (low < high && data[high].key.compareTo(pivotKey) >= 0) {
high--;
}
data[low] = data[high];
while (low < high && data[low].key.compareTo(pivotKey) <= 0) {
low++;
}
data[high] = data[low];
}
data[low] = data[0];
return low;
}
//堆排序
public static void HeapSort(Data[] data) {
//先对顺序表进行堆排序,建立大顶堆
int i;
Data temp;
for (i = (data.length-1)/2; i > 0; i--) {
HeapAdjust(data, i, data.length-1);
} //建立大顶堆
for (i = (data.length - 1); i >1; i--) {
temp = data[1];
data[1] = data[i];
data[i] = temp;
HeapAdjust(data, 1, i - 1);
}
}
private static void HeapAdjust(Data[] data, int start, int end) {
int j;
Data temp;
temp = data[start];
for (j = 2 * start; j <=end; j *=2) {
if (j < end && data[j].key.compareTo(data[j+1].key) < 0) {
j++;
}
if (temp.key.compareTo(data[j].key) >= 0) {
break;
}
data[start] = data[j];
start = j;
}
data[start] = temp;
}
//简单选择排序
public static void SimpleSelectSort(Data[] data) {
int i, j;
Data temp;
for (i = 1; i < data.length; i++) {
j = MinKey(data, i);
if (j != i) {
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
private static int MinKey(Data[] data, int start) {
int i, j = start;
Comparable temp;
temp = data[start].key;
if (data.length - start == 0) {
return start;
}
for (i = start + 1; i < data.length; i++) {
if (temp.compareTo(data[i].key) > 0) {
temp = data[i].key;
j = i;
}
}
return j;
}
//归并排序
private static Data[] originalnewData2;
private static Data[] newData2;
public static void MergingSort(Data[] data) {
originalnewData2 = new Data[data.length];
newData2 = new Data[data.length];
for (int i = 1; i < data.length; i++) {
originalnewData2[i]=new Data();
newData2[i] = new Data();
}
MSort(data, data, 1, data.length - 1);
}
private static void MSort(Data[] originalData,Data[] data, int start,
int end) {
if (start == end) {
data[start] = originalData[start];
}
else {
int mid = (start + end) / 2;
MSort(originalData, newData2, start, mid);
MSort(originalData, newData2, mid + 1, end);
//怎样才能像值传递一样使用引用传递,即不改变它的值
for(int k=start;k<=end;k++) originalnewData2[k]=new Data(newData2[k]);
merge(originalnewData2, data, start, mid, end);//这里的data好像不再是一开始传入的data,而是递归时的newData2
}
}
private static void merge(Data[] newData, Data[] data, int start, int mid,
int end) {
int i, j;
int k=start;
for (i = start, j = mid + 1; start <= mid && j <= end; i++) {
if (newData[start].key.compareTo(newData[j].key) <= 0) {
data[i] = newData[start++];
}
else {
data[i] = newData[j++];
}
}
if (start <= mid) {
for (int tempI = start; tempI <= mid; tempI++) {
data[i++] = newData[tempI];
}
}
if (j <= end) {
for (int tempJ = j; tempJ <= end; tempJ++) {
data[i++] = newData[tempJ];
}
}
}
//基数排序
public static void RadixSort(Data[] data,int digits){
int d,j,k,factor=1;
QueueInterface[] queues=new LinkQueue[10];
for(int i=0;i<10;i++){
queues[i]=new LinkQueue();
}
for(d=1;d<=digits;factor*=10,d++){
//distribution
for(j=1;j<data.length;j++){
queues[(((Integer)data[j].key).intValue()/factor)%10].put(new Data(data[j]));
}
//collection
for(j=0,k=1;j<10;j++){
while(!queues[j].isEmpty()){
data[k++]=(Data)queues[j].removeHead();
}
}
}
}
}
测试类:
package Sort;
public class Test {
public Test() {
}
//产生测试数据
public static Data[] getData(int size){
Data[] data=new Data[size+1];
int number;
for(int i=0;i<data.length;i++){
number=(int) (Math.random() * size*10);
data[i] = new Data(new Integer(number),new Integer(number));
}
return data;
}
//复制测试数据
public static Data[] duplicationData(Data[] data){
Data[] duplication=new Data[data.length];
for(int i=1;i<data.length;i++){
duplication[i]=new Data(data[i]);
}
return duplication;
}
public static void printData(Data[] data){
for(int i=1;i<data.length;i++)
System.out.print(data[i].toString());
}
public static void main(String[] args) {
long startTime,stopTime,sortingTime;
Data[] data=getData(6000);
Data[] data1,data2,data3,data4,data5,data6,data7,data8,data9,data10;
data1=duplicationData(data);
data2=duplicationData(data);
data3=duplicationData(data);
data4=duplicationData(data);
data5=duplicationData(data);
data6=duplicationData(data);
data7=duplicationData(data);
data8=duplicationData(data);
data9=duplicationData(data);
data10=duplicationData(data);
startTime= System.currentTimeMillis();
Sort.InsertionSort.straightInsertionSort(data1);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Straight Insertion Sort time is "+ sortingTime);
//System.out.println("Straight Insertion Sort Answer");
//printData(data1);
startTime= System.currentTimeMillis();
Sort.InsertionSort.BinaryInsertionSort(data2);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Binary Insertion Sort time is "+ sortingTime);
//System.out.println("Binary Insertion Sort Answer");
//printData(data2);
startTime= System.currentTimeMillis();
Sort.InsertionSort.ListInsertionSort(data3);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("List Insertion Sort time is "+ sortingTime);
//System.out.println("List Insertion Sort Answer");
//printData(data3);
startTime= System.currentTimeMillis();
Sort.QuickSort.BubbleSort(data4);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Bubble Sort time is "+ sortingTime);
//System.out.println("Bubble Sort Answer");
//printData(data4);
startTime= System.currentTimeMillis();
Sort.QuickSort.QuickSort(data5);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Quick Sort time is "+ sortingTime);
//System.out.println("Quick Sort Answer");
//printData(data5);
startTime= System.currentTimeMillis();
Sort.QuickSort.SimpleSelectSort(data6);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Select Sort time is "+ sortingTime);
//System.out.println("Select Sort Answer");
//printData(data6);
startTime= System.currentTimeMillis();
Sort.QuickSort.MergingSort(data7);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Merging Sort time is "+ sortingTime);
//System.out.println("Merging Sort Answer");
//printData(data7);
startTime= System.currentTimeMillis();
Sort.QuickSort.RadixSort(data8,5);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Radix Sort time is "+ sortingTime);
//System.out.println("Radix Sort Answer");
//printData(data8);
startTime= System.currentTimeMillis();
Sort.QuickSort.HeapSort(data);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
//System.out.println("Heap Sort time is "+ sortingTime);
//System.out.println("Radix Sort Answer");
//printData(data9);
startTime= System.currentTimeMillis();
Sort.QuickSort.OptimizeQuickSort(data10);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Optimize Quick Sort time is "+ sortingTime);
//System.out.println("Optimize Quick Sort Answer");
//printData(data10);
}
}
测试结果:
各种排序的测试数据表:
数
据
长
度
时
间
排
序
类
型
100
500
1000
10000
直接插入排序
0
10
20
1752
二分插入排序
0
10
10
551
表插入排序
10
10
30
2153
起泡排序
10
30
50
5068
快排
0
0
10
20
简单选择排序
30
20
20
3535
归并排序
0
0
60
190
基数排序
20
20
110
140
堆排序
0
0
0
10
关于快排:
快速排序的运行时间与划分是否对称有关,最糟的情况是每次划分时一边是一个元素,一边是n-1个,这种情况的时间复杂度是
在最好的情况是,每次划分的枢轴都是中值,此时的时间复杂度是 ,在一些书上提到快速排序在平均情况下的复杂度也是 ,所以可以提出一个处理恶化的方法,在排序算法的每一步,可以随机选取一个元素关键字作为枢轴,这样总体来说平均划分是对称的。
可以把取枢轴的算法改一下:
int RandomizedPartition(DataType[] a , int p , int r){
int i= Random(p , r);
Swap(a[i] ,a[p]);
return Partition(a,p,r);
}
500
1000
10000
100000
200000
普通快排
10
10
40
501
1181
优化快排
0
0
10
430
1142
可以看出,优化后的快排明显的提高了排序的速度,但是同时也可以看出,当元素很多时,交换的次数也增多了,使得优化后的排序的优势不很明显了,这是因为被排的数据是随机的。
下面显示的是这两种快排对有序的处理时间(数据>7000,内存溢出):
100
500
1000
3000
6000
普通快排
10
10
80
250
991
优化快排
0
40
20
160
731
由此可知,优化快排能缓解恶化。
package Sort;
class Data {
Comparable key;
Object value;
public Data() {
}
public Data(Data data){
this.key=data.key;
this.value=data.value;
}
public Data(Comparable key,Object value){
this.key=key;
this.value=value;
}
public String toString(){
return "key="+key+";"+"value="+value+";"+"\n";
}
}
Insertion.java
package Sort;
public class InsertionSort {
public InsertionSort() {
}
//直接插入排序,从下标1开始
public static void straightInsertionSort(Data[] data) {
int i, j;
for (i = 2; i <data.length; i++) {
if (data[i].key.compareTo(data[i - 1].key) < 0) {
data[0] = data[i];//复制为监视哨
for (j = i - 1; data[0].key.compareTo(data[j].key) < 0; --j) {
data[j + 1] = data[j];//记录右移
}
data[j + 1] = data[0];//插入
}
}
}
//折半插入排序,从下标1开始
public static void BinaryInsertionSort(Data[] data){
int i,j,low,high,mid;
for(i=2;i<data.length;i++){
if (data[i].key.compareTo(data[i - 1].key) < 0) {
data[0]=data[i];
//找插入位置
low=1;high=i-1;
while(low<=high){
mid =(low+high)/2;
if(data[0].key.compareTo(data[mid].key)<0) high=mid-1;
else low=mid+1;
}
//移动插入位置以后的元素
for(j=i-1;j>=high+1;j--){
data[j+1]=data[j];
}
data[high+1]=data[0];//插入
}
}
}
//表插入排序
public static void ListInsertionSort(Data[] data){
int i,j,k;
//inner class:Table
class Table{
Comparable key;
int next;
}
Table[] table=new Table[data.length];
for(i=1;i<data.length;i++){
table[i]=new Table();
table[i].key=data[i].key;
}
table[0]=new Table();
table[0].key=new Integer(Integer.MAX_VALUE);
table[0].next=1;
table[1].next=0;
for(i=2;i<data.length;i++){
for(j=0,k=table[0].next;table[k].key.compareTo(table[i].key)<=0;j=k,k=table[k].next);
table[j].next=i;
table[i].next=k;
}
Data[] newData=new Data[data.length];
int position=table[0].next;
for(i=1;i<data.length;i++){
newData[i]=data[position];
position=table[position].next;
}
//data=newData;//不知为什么不能把newData赋给data,而必须用下面的
for(i=1;i<data.length;i++){
data[i]=newData[i];
}
}
}
QuickSort.java
package Sort;
import Queue.*;
public class QuickSort {
public QuickSort() {
}
//起泡排序
public static void BubbleSort(Data[] data) {
int i, j, lastChangeIndex;
Data temp;
i = data.length - 1;
while (i > 1) {
lastChangeIndex = 1;
for (j = 1; j < i; j++) {
if (data[j + 1].key.compareTo(data[j].key) < 0) {
temp = data[j + 1];
data[j + 1] = data[j];
data[j] = temp;
lastChangeIndex = j;
}
}
i = lastChangeIndex;
}
}
//快速排序
public static void QuickSort(Data[] data) {
QSort(data, 1, data.length - 1);
}
public static void OptimizeQuickSort(Data[] data){
OQSort(data,1,data.length-1);
}
private static void QSort(Data[] data, int s, int t) {
int pivotLoc;
if (s < t) {
pivotLoc = Partition(data, s, t); //对data[1...data.length-1]进行一次划分
QSort(data, s, pivotLoc - 1); //对低子序列进行递归排序
QSort(data, pivotLoc + 1, t); //对高子序列进行递归排序
}
}
private static void OQSort(Data[] data,int s,int t){
int pivotLoc;
if(s<t){
pivotLoc=RandomPartition(data,s,t);
QSort(data, s, pivotLoc - 1); //对低子序列进行递归排序
QSort(data, pivotLoc + 1, t); //对高子序列进行递归排序
}
}
private static int RandomPartition(Data[] data,int low,int high){
//i是low
int i=(int)Math.random()*(high-low)+low;
Data temp=data[low];
data[low]=data[i];
data[i]=temp;
return Partition(data,low,high);
}
private static int Partition(Data[] data, int low, int high) {
Comparable pivotKey;
data[0] = data[low];
pivotKey = data[low].key; //枢轴
while (low < high) {
while (low < high && data[high].key.compareTo(pivotKey) >= 0) {
high--;
}
data[low] = data[high];
while (low < high && data[low].key.compareTo(pivotKey) <= 0) {
low++;
}
data[high] = data[low];
}
data[low] = data[0];
return low;
}
//堆排序
public static void HeapSort(Data[] data) {
//先对顺序表进行堆排序,建立大顶堆
int i;
Data temp;
for (i = (data.length-1)/2; i > 0; i--) {
HeapAdjust(data, i, data.length-1);
} //建立大顶堆
for (i = (data.length - 1); i >1; i--) {
temp = data[1];
data[1] = data[i];
data[i] = temp;
HeapAdjust(data, 1, i - 1);
}
}
private static void HeapAdjust(Data[] data, int start, int end) {
int j;
Data temp;
temp = data[start];
for (j = 2 * start; j <=end; j *=2) {
if (j < end && data[j].key.compareTo(data[j+1].key) < 0) {
j++;
}
if (temp.key.compareTo(data[j].key) >= 0) {
break;
}
data[start] = data[j];
start = j;
}
data[start] = temp;
}
//简单选择排序
public static void SimpleSelectSort(Data[] data) {
int i, j;
Data temp;
for (i = 1; i < data.length; i++) {
j = MinKey(data, i);
if (j != i) {
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
private static int MinKey(Data[] data, int start) {
int i, j = start;
Comparable temp;
temp = data[start].key;
if (data.length - start == 0) {
return start;
}
for (i = start + 1; i < data.length; i++) {
if (temp.compareTo(data[i].key) > 0) {
temp = data[i].key;
j = i;
}
}
return j;
}
//归并排序
private static Data[] originalnewData2;
private static Data[] newData2;
public static void MergingSort(Data[] data) {
originalnewData2 = new Data[data.length];
newData2 = new Data[data.length];
for (int i = 1; i < data.length; i++) {
originalnewData2[i]=new Data();
newData2[i] = new Data();
}
MSort(data, data, 1, data.length - 1);
}
private static void MSort(Data[] originalData,Data[] data, int start,
int end) {
if (start == end) {
data[start] = originalData[start];
}
else {
int mid = (start + end) / 2;
MSort(originalData, newData2, start, mid);
MSort(originalData, newData2, mid + 1, end);
//怎样才能像值传递一样使用引用传递,即不改变它的值
for(int k=start;k<=end;k++) originalnewData2[k]=new Data(newData2[k]);
merge(originalnewData2, data, start, mid, end);//这里的data好像不再是一开始传入的data,而是递归时的newData2
}
}
private static void merge(Data[] newData, Data[] data, int start, int mid,
int end) {
int i, j;
int k=start;
for (i = start, j = mid + 1; start <= mid && j <= end; i++) {
if (newData[start].key.compareTo(newData[j].key) <= 0) {
data[i] = newData[start++];
}
else {
data[i] = newData[j++];
}
}
if (start <= mid) {
for (int tempI = start; tempI <= mid; tempI++) {
data[i++] = newData[tempI];
}
}
if (j <= end) {
for (int tempJ = j; tempJ <= end; tempJ++) {
data[i++] = newData[tempJ];
}
}
}
//基数排序
public static void RadixSort(Data[] data,int digits){
int d,j,k,factor=1;
QueueInterface[] queues=new LinkQueue[10];
for(int i=0;i<10;i++){
queues[i]=new LinkQueue();
}
for(d=1;d<=digits;factor*=10,d++){
//distribution
for(j=1;j<data.length;j++){
queues[(((Integer)data[j].key).intValue()/factor)%10].put(new Data(data[j]));
}
//collection
for(j=0,k=1;j<10;j++){
while(!queues[j].isEmpty()){
data[k++]=(Data)queues[j].removeHead();
}
}
}
}
}
测试类:
package Sort;
public class Test {
public Test() {
}
//产生测试数据
public static Data[] getData(int size){
Data[] data=new Data[size+1];
int number;
for(int i=0;i<data.length;i++){
number=(int) (Math.random() * size*10);
data[i] = new Data(new Integer(number),new Integer(number));
}
return data;
}
//复制测试数据
public static Data[] duplicationData(Data[] data){
Data[] duplication=new Data[data.length];
for(int i=1;i<data.length;i++){
duplication[i]=new Data(data[i]);
}
return duplication;
}
public static void printData(Data[] data){
for(int i=1;i<data.length;i++)
System.out.print(data[i].toString());
}
public static void main(String[] args) {
long startTime,stopTime,sortingTime;
Data[] data=getData(6000);
Data[] data1,data2,data3,data4,data5,data6,data7,data8,data9,data10;
data1=duplicationData(data);
data2=duplicationData(data);
data3=duplicationData(data);
data4=duplicationData(data);
data5=duplicationData(data);
data6=duplicationData(data);
data7=duplicationData(data);
data8=duplicationData(data);
data9=duplicationData(data);
data10=duplicationData(data);
startTime= System.currentTimeMillis();
Sort.InsertionSort.straightInsertionSort(data1);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Straight Insertion Sort time is "+ sortingTime);
//System.out.println("Straight Insertion Sort Answer");
//printData(data1);
startTime= System.currentTimeMillis();
Sort.InsertionSort.BinaryInsertionSort(data2);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Binary Insertion Sort time is "+ sortingTime);
//System.out.println("Binary Insertion Sort Answer");
//printData(data2);
startTime= System.currentTimeMillis();
Sort.InsertionSort.ListInsertionSort(data3);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("List Insertion Sort time is "+ sortingTime);
//System.out.println("List Insertion Sort Answer");
//printData(data3);
startTime= System.currentTimeMillis();
Sort.QuickSort.BubbleSort(data4);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Bubble Sort time is "+ sortingTime);
//System.out.println("Bubble Sort Answer");
//printData(data4);
startTime= System.currentTimeMillis();
Sort.QuickSort.QuickSort(data5);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Quick Sort time is "+ sortingTime);
//System.out.println("Quick Sort Answer");
//printData(data5);
startTime= System.currentTimeMillis();
Sort.QuickSort.SimpleSelectSort(data6);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Select Sort time is "+ sortingTime);
//System.out.println("Select Sort Answer");
//printData(data6);
startTime= System.currentTimeMillis();
Sort.QuickSort.MergingSort(data7);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Merging Sort time is "+ sortingTime);
//System.out.println("Merging Sort Answer");
//printData(data7);
startTime= System.currentTimeMillis();
Sort.QuickSort.RadixSort(data8,5);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Radix Sort time is "+ sortingTime);
//System.out.println("Radix Sort Answer");
//printData(data8);
startTime= System.currentTimeMillis();
Sort.QuickSort.HeapSort(data);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
//System.out.println("Heap Sort time is "+ sortingTime);
//System.out.println("Radix Sort Answer");
//printData(data9);
startTime= System.currentTimeMillis();
Sort.QuickSort.OptimizeQuickSort(data10);
stopTime= System.currentTimeMillis();
sortingTime=stopTime-startTime;
System.out.println("Optimize Quick Sort time is "+ sortingTime);
//System.out.println("Optimize Quick Sort Answer");
//printData(data10);
}
}
测试结果:
各种排序的测试数据表:
数
据
长
度
时
间
排
序
类
型
100
500
1000
10000
直接插入排序
0
10
20
1752
二分插入排序
0
10
10
551
表插入排序
10
10
30
2153
起泡排序
10
30
50
5068
快排
0
0
10
20
简单选择排序
30
20
20
3535
归并排序
0
0
60
190
基数排序
20
20
110
140
堆排序
0
0
0
10
关于快排:
快速排序的运行时间与划分是否对称有关,最糟的情况是每次划分时一边是一个元素,一边是n-1个,这种情况的时间复杂度是
在最好的情况是,每次划分的枢轴都是中值,此时的时间复杂度是 ,在一些书上提到快速排序在平均情况下的复杂度也是 ,所以可以提出一个处理恶化的方法,在排序算法的每一步,可以随机选取一个元素关键字作为枢轴,这样总体来说平均划分是对称的。
可以把取枢轴的算法改一下:
int RandomizedPartition(DataType[] a , int p , int r){
int i= Random(p , r);
Swap(a[i] ,a[p]);
return Partition(a,p,r);
}
500
1000
10000
100000
200000
普通快排
10
10
40
501
1181
优化快排
0
0
10
430
1142
可以看出,优化后的快排明显的提高了排序的速度,但是同时也可以看出,当元素很多时,交换的次数也增多了,使得优化后的排序的优势不很明显了,这是因为被排的数据是随机的。
下面显示的是这两种快排对有序的处理时间(数据>7000,内存溢出):
100
500
1000
3000
6000
普通快排
10
10
80
250
991
优化快排
0
40
20
160
731
由此可知,优化快排能缓解恶化。
发表评论
-
第七:马士兵Struts2 视频学习笔记之访问Web元素
2013-06-26 22:36 595主要是访问request,session,applicati ... -
第六:马士兵Struts2 视频学习笔记之参数传递
2013-06-06 21:48 1021在action中接受参数的方法一共有三种: 第一种,在u ... -
排序算法之插入排序
2013-05-12 16:10 592package com.xiaojin; public cl ... -
java牛人(转载)
2013-04-27 21:24 764这篇文章是我无意中在 ... -
StringBuffer和String的区别
2013-04-13 11:08 23转载自http://www.cnblogs.com/sprin ... -
jdk环境变量配置(转载)
2013-04-13 11:09 642进行java开发,首先要安装jdk,安装了jdk后还要进行环境 ...
相关推荐
这份资料可能是从www.pigkrtv.com等网站转载而来,旨在帮助学习者深化对Java编程语言的理解,提高编程技能。 在Java编程学习过程中,掌握基本概念、语法以及解决问题的能力至关重要。这份习题集涵盖了以下几个关键...
通过阅读《Java常见面试题.doc》、《Java面试题1.htm》、《5559.htm》、《Java面试题2.htm》、《java面试笔试题大汇总 及c-c++面试试题(转载 ) - happyfish - BlogJava.mht》以及《Java常见面试题.txt》等文件,您...
很早以前写的算法演示程序,用动画的方式演示顺序查找、二分查找、冒泡、快速排序、选择排序等算法。 可以显示当前的算法代码以及当前正在执行的语句,并可调整演示速度。 放到要发霉了,拿出来给大家看看,如有转载...
同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地...
同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地...
同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地...
同时,转载时不要移除本申明。如产生任何纠纷,均与本博客所有人、发表该文献之人无任何关系。谢谢合作 本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地...
需要处理论坛数据的展示逻辑,包括分页、排序和筛选。 8. **list.asp**:可能是信息列表页,展示某一分类下的所有信息,通常带有分页功能。需要处理数据库查询以获取分类信息并进行展示。 9. **hyclass.asp**:...
华为笔试题java 榜单设立目的 :China: GitHub中文排行榜,帮助你发现高分优秀中文项目; 各位开发者伙伴可以更高效地吸收国人的优秀经验、成果; 中文项目只能满足阶段性的需求,想要有进一步提升,还请多花时间学习...
3. `java.util.Arrays`类的`binarySearch`方法用于在已排序的数组中查找指定元素的位置,这是Java标准库中处理数组的常见操作。 4. 介绍Java中带参数方法的使用,强调定义和调用过程,指出参数可以是任意类型,包括...
在数据结构领域,已有多种编程语言的相关教材,包括Pascal、C、C++和Java等,这些教材覆盖了广泛的数据结构理论和技术。然而,随着微软推出的C#语言及其.NET Framework的不断发展,这一领域的需求也在逐渐变化。 **...
java安卓仿微信聊天软件源码 榜单设立目的 :China: GitHub中文排行榜,帮助你发现高分优秀中文项目; 各位开发者伙伴可以更高效地吸收国人的优秀经验、成果; 中文项目只能满足阶段性的需求,想要有进一步提升,还请...
2. 重复或转载网页的消除:搜索引擎需要识别和处理内容相同的网页,以防止同一信息多次出现在搜索结果中。 3. 链接分析:通过分析网页之间的链接关系,评估网页的重要性,如PageRank算法。 4. 网页重要程度计算:...
在实际项目中,我们还应该考虑对捕获到的异常进行分类和优先级排序,以便更有效地解决问题。同时,为了提供更好的用户体验,我们还可以在异常处理后提示用户程序遇到了问题,并给出相应的解决方案或者引导用户重新...
java 版本,自己写的,个别题目和书中介绍的思路有出入,但是绝大多数是一致的。因为从头到尾都是自己手写的,难免出错,欢迎帮忙纠错。 转载算法实现请注明出处。 第二章 面试需要的基础知识 编程语言 数据结构 ...
Auntion-TableSort最新版 修复了一个数字排序的问题.放出下载 07年5月5日Auntion TableSort 测试交流第一版 (下一版将会存在部分表格相关特效) —————————————————————————– 作者:...
11. **SQL与编程语言的交互**:在实际开发中,我们通常通过编程语言(如Java、Python等)来调用SQL,进行数据操作,了解如何在代码中执行SQL语句至关重要。 12. **数据库设计与规范化**:良好的数据库设计遵循范式...
华为笔试题java 榜单设立目的 :China: GitHub中文排行榜,帮助你发现高分优秀中文项目; 各位开发者伙伴可以更高效地吸收国人的优秀经验、成果; 中文项目只能满足阶段性的需求,想要有进一步提升,还请多花时间学习...