您的位置:首页 > 其它

排序

2015-09-05 18:44 281 查看
public class Sort {
/**
* @param data
* 冒泡排序  比较接近选择排序,不同的是冒泡排序一直在交换,而选择排序是不断比较,
* 直到确定正确的下标一次交换完成
*/
public void bubble_sort(int[] data) {
int temp;
for(int i=0; i<data.length; i++){
//内层循环从后向前,找到最小值.循环终止时,最小值处于i位置
for (int j=data.length-1; j>i; j--){
if(data[j]<data[j-1]){
temp = data[j-1];
data[j-1] = data[j];
data[j] = temp;
}
}
}
}

/**
* 插入排序  固定元素找位置
* @param data 手中有data.length张牌,从第二张牌开始直到最后一张牌
* 插入前面已经排好序的牌中,程序中的j起到遍历之前已排好序的牌的作用
*/
public void insert_sort(int[] data) {
int key,j;
for(int i=1; i<data.length; i++){
key = data[i];
j= i-1;
//key相当于data[j+1],因为0~j数据都是有序的,key只要比j大
//则比0~j都要大
while(j>=0 && key<data[j]){
data[j+1] = data[j];//可以理解为元素向后移动
j--;
}
data[j+1] = key;
}
}

/**
* 选择排序 固定位置找元素
* @param data
*/
public void selection_sort(int[] data) {
int smallest,temp;
for(int i=0; i<data.length-1; i++){
smallest = i;
for(int j=i+1; j<data.length; j++){
if(data[j] < data[smallest]){
smallest = j;
}
}

temp = data[i];
data[i] = data[smallest];
data[smallest] = temp;
}
}

/**归并排序
* @param data
*/
public void  merge_sort(int[] data){
merge_sort(data, 0, data.length-1);
}
private void merge_sort(int[] data, int p, int r) {
//这段代码可这样理解:
//一个大数组传入,被分成两半,两半数组分别传入
//再又被分成两半,直到每一半只有一个元素
//然后开始合并
if(p<r){
int q = (p+r)/2;
merge_sort(data,p,q);
merge_sort(data,q+1,r);
merge(data,p,q,r);
}
}
private void merge(int[] data, int p, int q, int r) {

//新建数组L,R
//L保存原数组p~q元素
//R保存原数组q+1~r元素
int L[] = new int[q-p+1];
int R[] = new int[r-q];
System.arraycopy(data, p, L, 0, L.length);
System.arraycopy(data, q+1, R, 0, R.length);

//变量k的作用在于将原数组p~r位置的元素按从小到大顺序重排
//i,j分别用来遍历左右数组
int i=0;
int j=0;
int k;
for(k=p; k<=r; k++){
if(L[i]<=R[j]){
data[k] = L[i];
i++;
//数组到头,循环结束
if(i==L.length){
break;
}
}else{
data[k] = R[j];
j++;
if(j==R.length){
break;
}
}
}
//当某个数组遍历完,考虑到两个子数组都是有序的
//只需要将另外一个数组的剩余值全部复制到原数组
//上面循环退出时,k位置已经被赋值,所以是++k
//另一个数组的赋值却未能执行,所以是i(j)++
while(i<L.length){
data[++k] = L[i++];
}
while(j<R.length){
data[++k] = R[j++];
}

}

/**
* 快速排序
* @param data
*/
public void quick_sort(int[] data){
quick_sort(data, 0, data.length-1);
}
private void quick_sort(int[] a, int p, int r){
if(p < r){
int q = partition(a, p, r);
quick_sort(a,p,q-1);
quick_sort(a,q+1,r);
}
}
/**
* @return
*/
private int partition(int[] a, int p, int r){
int i = p-1;
int x= a[r];
int temp;
//选最后一个数字作为比较对象,方便for循环书写,中间没有被隔断
for (int j = p ; j<r; j++){
if(a[j] <= x){
i = i+1;
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
temp = a[i+1];
a[i+1] = a[r];
a[r]  = temp;
return i+1;
//j用来遍历数组,i用来标记将要发生交换的位置
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: