您的位置:首页 > 编程语言 > Java开发

Java常用的排序

2018-03-16 17:18 183 查看
1.冒泡排序:冒泡排序的思想,就是把数组里面的数值通过两两比较,将其最大或最小的数向右或者是向左移动,通过循环n-1次,达到排序的目的public class NumberArrayBuilder {

/**
* 获取一个随机大小,随机元素的数组。
* Description: TODO
*
* @return
*/
public static int[] getRandomNumberArray(){
Random rd=new Random();
int lenght=1;
lenght+=rd.nextInt(20);
int[] array=new int[lenght];
for(int i=0;i<lenght;i++){
array[i]=rd.nextInt(100);
}
return array;
}
public static void main(String[] args) {
int [] array= getRandomNumberArray();
int lenght=array.length;

/**
* 冒泡排序,循环n-1次,两两比较
*/
for(int i=1;i<lenght;i++){//总共循环n-1趟
for(int j=0;j<lenght-i;j++){ //从第0个一直比到数组长度减去i个
if(array[j]<array[j+1]){//一旦发现前面的数值比后面的数值还要小,那么就交换它们的数值
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}

}2,快速排序:快速排序的思想就是通过一个基准值把一个数组不断的分成两部分,左边部分存大数值,右边存小数值,直到所有的部分都只有一个数值的时候就排好序了,主要是用到了分治思想。        /**
*快速排序,通过分治法来分割数组
*/

public static void quickSort(int[] number, int start, int end) {
if(start >= end)//一旦数组的左下标与数组的右下标相同,那么就说明这个部分已经排到底了
return;
int i = start;
int j = end;
int base = number[start];//一般是设传过来的开始下标对应的值为基准值
while(i != j) {//如果i与j相等,表明这一轮的比较已经结束了
while(number[j] <= base && j > i)//如果右边的值小于基准值并且右下标的索引大于左下标的索引,那么就那向左一位的数值接着比较
j--; //一旦出现number[j] <= base或者 j>i的条件不满足,那就走下一步,去比较左边部分的
while(number[i] >= base && i < j)//同理,一旦这个条件也不满足,就表明number[j]>number[i]或者是i与j的关系不满足
i++;
if(i < j) {//这个条件是表明i与j中间还有数值没有进行比较,同时number[j]>number[i],所以将其交换
int temp = number[i];
number[i] = number[j];
number[j] = temp;
}
}
// 一旦进入这里,表明这一轮已经比较好了,就是还剩下一个相对的中间值,此时要将这个中间值与基准值比较一下,如果比基准值大,就替换掉
if(base<number[i]){
number[start] = number[i];
number[i] = base;
    }
quickSort(number, start, j - 1);//左边部分重新分治
quickSort(number, i + 1, end);//右边

}3.选择排序:选择排序的思想就是先找到一个当前相对大的值,记住它的下标,让后拿记下的索引接着去比较看有没有比它更大的数,如果有,重复之前的操作,一直到没有比它更大的,就可以进入下一趟了,直至n-1趟跑完。同时要注意在比较的过程中是没发生值交换的。 /**
* 选择排序
*/
for(int i=0;i<lenght-1;i++){//开始循环n-1趟
int k=i;//定义一个k来存储最大值的索引
for(int j=lenght-1;j>i;j--){//从最后的值比起
if(array[k]<array[j]){//如果有值比k索引对应的值要大,那么将该值得索引位置赋给k,改变k的值,让它指向一个更大的值
k=j;//只是将j的值赋给了k
}
}
int temp=array[k];//一旦内嵌的for循环跑完了,说明已经比完了一趟,此时我们将值进行交换
array[k]=array[i];
array[i]=temp;
}4.插入排序:插入排序的思想其实就是先把第一个看成是已经排好序的,然后后面的数据不断的与前面的数据进行比较

/**
* 插入排序,通过不断的那后面一个值与前面已经排好序的数组进行比较达到排序的目的
* Description: TODO
*
* @param array
*/
public static void insertionSort(int array[]) {
int lenght=array.length;
int j=0;
for(int i=1;i<lenght;i++){//从第二数值进行比较,默认第一个数值是已经排好序的了
int temp=array[i];//将这个值赋给一个临时变量好与前面的数组进行比较
for( j=i-1;j>=0;j--){//这个循环里面从0-(i-1)里面的数据都是已经排好序的了
if(temp>array[j]){//如果发现排好序的数组里面有值比temp要小,那么我将该值赋给j+1索引位对应的数值,为什么可以这样呢,
array[j+1]=array[j];//因为我这个if语句有个else,else里面有个return。也就意味着,它第一次进入这个判断语句
}else{
4000
//肯定对应的就是i这个位置,不然会直接return掉的
return ;
}
}
array[j+1]=temp;//这个地方j+1是因为在for循环时多减去了一个一,所以这里要补回来,那么它就对应了内嵌for循环中的j位置,从而
//将要插入的值给插入了进来,其实for循环里面的不断给后面的位置赋值可以看成是插入点后面的数据集体往后移动了一位
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序