多种排序算法Java实现

  • 冒泡排序

    实现思想:

⒈ 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
⒉ 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
⒊针对所有的元素重复以上的步骤,除了最后一个。
⒋持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

代码如下:

public static void bubble(int[] random){
    for(int i = 0;i<random.length;i++){
        for(int j = 0;j<random.length-i-1;j++){
            if(random[j]>random[j+1]){
                int t = random[j];
                random[j] = random[j+1];
                random[j+1] = t;
            }
        }
    }
}
  • 选择排序

    实现思想:

对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元素小则用一个变量k来记住他的位置,接着第二次比较,前面“后一个元素”现变成了“前一个元素”,继续跟他的“后一个元素”进行比较如果后面的元素比他要小则用变量k记住它在数组中的位置(下标),等到循环结束的时候,我们应该找到了最小的那个数的下标了,然后进行判断,如果这个元素的下标不是第一个元素的下标,就让第一个元素跟他交换一下值,这样就找到整个数组中最小的数了。然后找到数组中第二小的数,让他跟数组中第二个元素交换一下值,以此类推。

代码如下:

public static void selectSort(int random[]){
    int min = 0,index = 0 ;
    for(int i = 0;i<random.length;i++){
        min = random[i];
        index = i;
        for(int j = i;j<random.length;j++){
            if(random[j]<min){
                min = random[j];
                index = j;
            }
        }
        int t = random[i];
        random[i] = min;
        random[index] = t;
    }
}
  • 插入排序

    实现思想:

⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2~5

代码如下:

public static void insertSort(int random[],int low,int hight){
    for(int i = low+1;i<hight;i++){
        if(random[i]<random[i-1]){
            for(int j = i;j>low;j--){
                if(random[j]<random[j-1]){
                    int t = random[j];
                    random[j] = random[j-1];
                    random[j-1] = t;
                }else{
                    break;
                }
            }
        }
    }
}
  • 快速排序

    实现思想:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

代码如下:

public static void quickSort(int[] random,int begin,int end){
    if(begin>=end){
        return ;
    }else{
        int pivot = random[begin],storeIndex = begin+1,t = 0;
        for(int i=begin;i<end;i++){
            if(random[i]<pivot){
                t = random[i];
                random[i] = random[storeIndex];
                random[storeIndex] = t; 
                storeIndex++;
            }
        }
        t = random[storeIndex-1];
        random[storeIndex-1] = pivot;
        random[begin] = t;
        quickSort(random,begin,storeIndex-2);
        quickSort(random,storeIndex,end);
    }
}
  • 归并排序

实现思想:

比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。

代码如下:

public static void mergeSort(int random[]){
    for(int i = 1;i<random.length;i=i*2){
     merge(random,0,i);
    }
 }

public static void merge(int random[],int begin,int gap){
    int i = begin;
    while(i+2*gap<random.length){
        mSort(random,i,gap,i+2*gap);
        i = i+2*gap;
    }

    if(i+gap<random.length){
        mSort(random,i,gap,random.length);
    }
 }

public static void mSort(int random[],int begin,int gap,int end){
    int middle  = begin + gap;
    int[] copyArray = new int[random.length];
    int i = begin,j = middle;
    int k = 0;
    while(i<middle&&j<end){
        if(random[i]<=random[j]){
            copyArray[k++] = random[i];
            i++;
        }else{
            copyArray[k++] = random[j];
            j++;
        }
    }
    while(i<middle){
        copyArray[k++] = random[i];
        i++;
    }
    while(j<end){
        copyArray[k++] = random[j];
        j++;
    }
    for(int n = 0;n<k;n++){
        random[begin++] = copyArray[n];
    }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值