1.简单选择排序
/**
* 简单选择排序
* @param r
* @param low
* @param high
*/
public void selectSort(Object[] r, int low, int high) {
for(int k=low; k<high-1; k++){//做n-1趟选取
int min = k;
for(int i=min+1; i<=high; i++){//选择关键字最小的元素
if(strategy.compare(r[i], r[min]) <0 ){
min = i;
}
}
if(k != min){
Object temp = r[k];//关键字最小的元素与元素r[k]交换
r[k] = r[min];
r[min] = temp;
}
}
}
2.树形选择排序
3.堆排序
/**
* 调整r[low,high]使之成为大顶堆
* @param r 是除r[low]之外,其余元素均满足堆的定义
* @param low
* @param high
*/
private void heapAjust(Object[] r,int low,int high){
Object temp = r[low];
for(int j=2*low; j<=high; j=j*2){//沿关键值较大的元素向下进行筛选
//j指向关键值较大的元素
if(j<high && strategy.compare(r[j], r[j+1]) <0){
j++;
}
//若temp比其孩子都大,则插入到low所指位置
if(strategy.compare(temp, r[j]) >= 0){
break;
}
r[low] = r[j];
low = j;//向下筛选
}
r[low] = temp;
}
/**
* 堆排序
* @param r
*/
public void heapSort(Object[] r){
int n = r.length-1;
for(int i=n/2; i>=1; i--){//初始化建堆
heapAjust(r, i, n);
}
for(int i=n; i>1; i--){//不断输出堆顶元素并调整r[1..i-1]为新堆
Object temp = r[1];//交换堆顶与堆底元素
r[1] = r[i];
r[i] = temp;
heapAjust(r, 1, i-1);//调整
}
}