Java八大排序算法(一)

转载请标明出处:http://blog.csdn.net/yuqing_1102/article/details/55261837

一、概述

排序分为内部排序和外部排序,内部排序是数据记录在内存中进项排序,外部排序是数据量太大,一次不能容纳全部的排序记录,在排序时需要访问外存。
这里写图片描述

二、交换排序-冒泡排序

1.基本思想:

在要排序的一组数中,自上向下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现他们的排序与排序要求相反是,就将它们互换。

2.冒泡排序的示例:

这里写图片描述

3.算法的实现:

/**
  * 冒泡排序
  * 比较相邻的两个数,如果第一个比第二个大,则进行交换
  * 对每一对相邻的数做同样的工作,从第一对到最后一对,第一次排序后,最大的数在结尾
  * 针对所有的元素重复以上步骤,除了最后一个
  * 持续对每次越来越少的元素重复上面的步骤,直到没有任何一对元素进行比较
  * @param a 需要排序的整数数组
  */
public static void bubbleSort(int[] a){
    for (int i = 0; i < a.length - 1; i++) {  //第i趟排序
        for (int j = 0; j < a.length - 1 -i; j++) {
            if (a[j] > a[j+1]) {
                int temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
}

三、交换排序-快速排序

1.基本思想

选择一个基准元素,通常选择第一个元素或最后一个元素,通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素均比基准元素小,另一部分记录的元素值均比基准值大。一趟排序后,此时的基准元素在其排好序的正确位置,然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

2.快速排序示例:

(1)一趟排序的过程:
这里写图片描述
(2)排序的全过程:
这里写图片描述

3.算法的实现

调用:quickSort(sorts, 0, a.length - 1);
/**
 * 查找出中轴(默认是到最低位low)在排序后所在的正确位置
 * @param a 需要排序的整数数组
 * @param low 开始位置
 * @param high 结束位置
 * @return 中轴所在的正确位置
 */
public static int getMiddle(int a[], int low, int high){
    int key = a[low]; //默认数组第一个数作为中轴

    while (low < high) {
        // 从high位置开始找比key小的,与low互换
        while (low < high && a[high] >= key) {
            high--;
        }
        a[low] = a[high];
        // 从low位置开始找比key大的,与low互换
        while (low < high &&  a[low] <= key) {
            low++;
        }
        a[high] = a[low];
    }
    a[low] = key;
    return low;
}
/**
 * 递归形式的分治排序算法
 * @param a 需要排序的整数数组
 * @param low 开始位置
 * @param high 结束位置
 */
public static void quickSort(int a[], int low, int high){
    if (low < high) {  //如果不加此判断会导致数组溢出
        int middle = getMiddle(a, low, high);
        quickSort(a, low, middle - 1);  //递归对低子表快速排序
        quickSort(a, middle + 1, high);  //递归对高子表快速排序
    }
}

四、选择排序-简单选择排序

选择排序和冒泡排序差不多,只是冒泡排序是在发现比它小的时候就交换,而选择排序时只有确定了最小的数据之后,才会发生交换。

1.基本思想

在要排序的一组数中,选出最小(或最大)的一个数与第一个位置的数交换,然后在剩下的数当中再找最小(或最大)的一个数与第二个位置的数交换,以此类推,直到第n-1个元素(倒数第二个数)和第n个数(最后一个数)比较为止。

2.简单选择排序示例:

这里写图片描述

3.算法的实现

/**
 * 简单选择排序
 * 
 * @param a 需要排序的整数数组
 */
public static void selectSort(int a[]){
    for (int i = 0; i < a.length; i++) { //第i趟排序
        int  min = i;   //最小值下标位置
        for (int j = i+1; j < a.length; j++) {
            if (a[min] > a[j]) {
                 min = j;  // 记下目前找到的最小值所在的位置
            }
        }
        if (i != min) {
            int temp = a[i];
            a[i] = a[min];
            a[min] = temp;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值