转载请标明出处:http://blog.youkuaiyun.com/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;
}
}
}