[size=large][color=red]快速排序:[/color][/size]
先选择表中的一个元素作为划分元素.接下来,对表进行划分,小于划分元素的所有元素放到划分元素的左侧,大于划分元素的所有元素放大它的右侧.最后,再用这种策略对两个划分的字段进行排序.
[size=large][color=red]归并排序:[/color][/size]
开始时将表分为大致相等的两端,然后对每个字表递归调用自身.继续这个递归调用过程,直到到达递归的基础情形时为止,这时表分为很多只含有一个元素的字表.然后,控制返
回递归调用结构,算法将从两个递归调用中得到的两个有序子段合并为一个有序表.
先选择表中的一个元素作为划分元素.接下来,对表进行划分,小于划分元素的所有元素放到划分元素的左侧,大于划分元素的所有元素放大它的右侧.最后,再用这种策略对两个划分的字段进行排序.
public static void quickSort (Comparable[] data, int min, int max) {
int pivot;
if (min < max){
pivot = partition(data, min, max);
quickSort(data, min, pivot-1);
quickSort(data, pivot+1, max);
}
}
//为快速排序提供的分区方法
private static int partition (Comparable[] data, int min, int max){
//把第一个元素作为划分元素
Comparable partitionValue = data[min];
int left = min;
int right = max;
while (left < right ) {
//寻找一个大于划分元素的值
while (data[left].compareTo(partitionValue) <= 0 && left < right)
left ++;
//寻找一个小于划分元素的值
while (data[right].compareTo(partitionValue) > 0 )
right --;
if (left < right)
swap(data, left, right);
}
swap(data, min, right);
return right;
}
[size=large][color=red]归并排序:[/color][/size]
开始时将表分为大致相等的两端,然后对每个字表递归调用自身.继续这个递归调用过程,直到到达递归的基础情形时为止,这时表分为很多只含有一个元素的字表.然后,控制返
回递归调用结构,算法将从两个递归调用中得到的两个有序子段合并为一个有序表.
public static void mergeSort(Comparable[] data, int min, int max) {
if(min < max) {
int mid = (min + max) / 2;
mergeSort(data, min, mid);
mergeSort(data, mid + 1, max);
merge(data, min, mid, max);
}
}
public static void merge(Comparable[] data, int first, int mid, int last) {
Comparable[] temp = new Comparable[data.length];
int first1 = first, last1 = mid; //endpoints of first subarray
int first2 = mid + 1, last2 = last; //endpoints of second subarray
int index = first1;
while(first1 <= last1 && first2 <= last2) {
if(data[first1].compareTo(data[first2]) < 0) {
temp[index] = data[first1];
first1 ++;
}
else {
temp[index] = data[first2];
first2 ++;
}
index ++;
}
//Copy remaining elements from first subarray, if any
while(first1 <= last1) {
temp[index] = data[first1];
first1 ++;
index ++;
}
//Copy remaining elements from second subarray, if any
while(first2 <= last2) {
temp[index] = data[first2];
first2 ++;
index ++;
}
//Copy merged data into original array
for (index = first; index <= last; index++)
data[index] = temp[index];
}