package com.java.dataStructArithmeic.sort;
/**
* @author gongpeibao
* @since 2012.03.16
* 基本排序方法
* 选择排序放比冒泡排序效率高,原因是它的交换次数少了,比较次数都是N*(N-1)/2
* 插入排序法是这儿最好的一种基本排序方法,虽然排序算法仍然需要O(N^2)的时间,
* 但是一般情况下比冒泡排序快一倍,比选择排序还要快一点
* 应用方法:
* 在数据量很小,并且交换数据相对于比较数据 更加耗时的情况下,应用选择排序
* 假设数据量很小或基本上有序时,插入排序算法是最好的选择
* 对于大数据量的排序来说,快速排序是最好的方法
*/
public class BubbleSort {
public static void main(String[] args) {
// int[] values = { 3, 1, 6, 2, 9, 0, 7, 4, 5 }; //数组
int[] values = { 3, 1, 6}; //数组
// BubbleSort.bubbleSort(values); //冒泡排序
// selectSort(values); //选择排序
insertSort2(values); //插入排序
int length = values.length;
for (int i = 0; i < length; i++) {
System.out.println(values[i]);
}
}
/**
* 冒泡排序法
* @param values 排序数组
*/
public static void bubbleSort(int[] values) {
int length = values.length;
// 外面的for循环控制趟数
for (int i = 0; i < length; i++) {
// 里面的for循环控制比较次数
for (int j = 0; j < length - i - 1; j++) {
// 满足条件则交换数据
if (values[j] > values[j + 1]) {
int temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
}
}
}
}
/**
* 选择排序法
* 交换次数从O(N^2) 降到了O(N)
* @param values 排序数组
* 直接选择排序算法的思想比较简单:(假设数据放在一个数组a中,且数组的长度是N)
* 从a[0]-a[N-1]中选出最小的数据,然后与a[0]交换位置
* 从a[1]-a[N-1]中选出最小的数据,然后与a[1]交换位置(第1步结束后a[0]就是N个数的最小值)
* 从a[2]-a[N-1]中选出最小的数据,然后与a[2]交换位置(第2步结束后a[1]就是N-1个数的最小值)
* 以此类推,N-1次排序后,待排数据就已经按照从小到大的顺序排列了。
* */
public static void selectSort(int[] values){
int length = values.length;
for(int i = 0; i < length-1; ++i)
{
int k = i; //记录第一个元素的位置,作为比较基准
for(int j = i; j < length; ++j)
{
//如果有比基准小的值,则用小的作为新的基准,同时选出最小的值
if(values[k] > values[j])
{
k = j;
}
}
if(k != i)
{
//交换元素
int temp = values[i];
values[i] = values[k];
values[k] = temp;
}
}
}
/**
* 插入排序法
* @param values 排序数组
*/
public static void insertSort(int[] values){
int length = values.length;
for(int i = 1;i <length; i++){
int j = -1;
//找到element[i]应该摆放的位置,此处可以利用查找算法进行优化
while(j <= i && values[i] > values[++j])
{
System.out.println(values[i]+"-"+values[++j]);
}; //分号,进行空处理
if(j < i){
//将j之后的数据移动一位,然后把values[i]移动到j处
int temp = values[i]; //循环把数组第二个值放到temp里
for(int k = i-1;k >= j;k--){
values[k+1] = values[k];
}
values[j] = temp;
}
}
}
/**
* 插入排序法 方法2更容易理解
* @param values 排序数组
* 不变性
* 每趟结束时,在temp位置的项插入后,比outer小的下标的数据项都是局部有序的
*/
public static void insertSort2(int[] values){
int length = values.length;
for(int i = 1;i<length;i++){
//循环把数组第二个值放到temp里
int tmp = values[i];
int j = i-1; //从左边的第一个开始比较
while(tmp<values[j]){ //循环
values[j+1] = values[j]; //右移一个
j--;
if(j == -1) //判断当前元素是否是第一个元素,如果是第一个元素,则停止循环
break;
}
values[j+1] = tmp; //将拿出来的那个放到比其小的位置
}
}
}