java 排序(二)

[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];

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值