-
选择排序(Select Sort)
选择排序是任何一个程序员最容易接收的一种排序方式,也非常符合人的直观思维!很简单的一个道理,假如我们有一堆数据,最简单想到的排序方式无非就是一堆数中找出最小的放在开头,再在剩余的找到剩余数中的最小值 以此类推……
public static void selectSort(int[] arr)
{
for (int i = 0 ; i < arr.length-1 ; i++) //需要找到的位置
for (int j = i+1 ; j < arr.length ; j++ ) // 与之比较的内容
{
if (arr[i] > arr[j])//如果发现待定的位置竟然比比较的内容大就需要交换了!
{
//交换内容
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
-
冒泡排序(bubble Sort)
冒泡排序形如其名,简单的理解就是将一部分数据中最大的一个往后”冒“,那么对此我们需要做的就是将数组内每俩相邻内容比较后决定谁能冒! ![冒泡排序](https://img-blog.csdnimg.cn/20190318225530615.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjYyNzU5NA==,size_16,color_FFFFFF,t_70) 这是一次的冒泡过程,也就是说我们通过对比相邻两数的大小将大数冒出至右边,而当进入下一次冒泡则只需要在1 3 4 2 5 之间重复即可 显然这里有6个数,我们需要进行五层冒泡(第六层只会剩下一个最小的,可以忽略) 而分析可以得知: 第一层:比较5次 第二层:比较4次 第三层:比较3次 第四层:比较2次 第五层:比较1次 他们都是从第一对开始比较的
public static void BubleSort(int[] arr)
{
for (int i = 0 ; i < arr.length-1 ; i++)//共进行arr,length -1 层冒泡
for (int j = 0 ; j < arr.length-i-1; j ++)//每一层冒泡过程需要的比较次数应该是arr.length-1-i,且都从j = 0开始
{
if (arr[j] > arr[j+1])//本次比较如果发现前者大于后者则需要往后冒出
{
//交换内容
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
3.插入排序(Insert Sort)
插入排序,则是通过每一轮将有序的一部分看为一个整体,该部分的下一个元素试图有序地插入这一整体。
诚如图示,每一次插入都是插入一个有序整体后紧随着的下一个元素
第一次插入: 有序整体含1个元素
第二次插入: 有序整体含2个元素
第三次插入: 有序整体含3个元素
第四次插入: 有序整体含4个元素
第五次插入: 有序整体含5个元素
public static void insertSort(int[] arr)
{
for (int i = 1 ; i < arr.length ; i ++)//待插入元素
{
for (int j = 0 ; j < i ; j ++)//待插入的有序整体下标为0~(i-1)
{
if (arr[j] > arr[i])
//将待插入元素与有序整体依次比较,
//大的元素再次成为待插入元素继续比较
{
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
}
4.快速排序(Quick Sort)
快速排序是排序算法中效率很高的一种,它的原理说起来很简单但代码思想需要一定的时间去理解吸收,它的思想主要即是将一堆数据中取一个基准值(往往是首元素,当然为了效率也可以选择更适合的元素),然后将比基准值小的放在其左,大的放在其右, 最后,左右两边各自重复上述过程,直到左边或右边只剩下一个数(或零个数)无法继续为止
然后补上我们递归方式实现的快速排序
public static void quickSort(int[] arr , int begin , int end)
{
//此处的if有两个作用 一是防止错误输入,二是防止溢出(begin在上一层最后经过自减
//很可能超出了范围变成-1,也就是恰好左右指针在数组首处会合时)
if (begin < end && arr != null)
{
int left = begin;//左指针
int right = end; //右指针
int pivot = arr[begin];//将首位元素作为基准
while (left != right)
{
while (left < right && arr[right] > pivot)
right--;
if (left < right)//说明退出是因为right找到了比基准更小的数
arr[left++] = arr[right];
while (left < right && arr[left] < pivot)
left++;
if (left < right)//说明退出是因为left找到了比基准更大的数
arr[right--] = arr[left];
}//当左右指针相同时 则说明找到了pivot基准的位置
arr[left] = pivot;
quickSort(arr,begin,--left);
quickSort(arr,++right,end);
}
}
4.java 系统排序
JDK 为我们提供的排序方法 Arrays.sort(ary)的效率往往更高而且更多的应用在工作中!
我们来对比一下他们的效率
public static void test()
{
int[] arr = new int[2000];
int[] arr1 ;
int[] arr2;
int[] arr3;
int[] arr4;
for (int i = 0 ; i < arr.length ; i ++)
{
int random = new Random().nextInt(2000);
arr[i] = random;
}
arr1= Arrays.copyOf(arr,arr.length);
arr2= Arrays.copyOf(arr,arr.length);
arr3= Arrays.copyOf(arr,arr.length);
arr4= Arrays.copyOf(arr,arr.length);
long begin;
long end;
begin = System.currentTimeMillis();
selectSort(arr);
end = System.currentTimeMillis();
System.out.println("选择排序耗时"+(end-begin)+"ms");
System.out.println(Arrays.toString(arr));
begin = System.currentTimeMillis();
BubleSort(arr);
end = System.currentTimeMillis();
System.out.println("冒泡耗时"+(end-begin)+"ms");
System.out.println(Arrays.toString(arr));
begin = System.currentTimeMillis();
insertSort(arr);
end = System.currentTimeMillis();
System.out.println("插入排序耗时"+(end-begin)+"ms");
System.out.println(Arrays.toString(arr));
begin = System.currentTimeMillis();
quickSort(arr,0,arr.length-1);
end = System.currentTimeMillis();
System.out.println("快速排序耗时"+(end-begin)+"ms");
System.out.println(Arrays.toString(arr));
begin = System.currentTimeMillis();
Arrays.sort(arr);
end = System.currentTimeMillis();
System.out.println("系统排序耗时:"+(end-begin)+"ms");
System.out.println(Arrays.toString(arr));
}
结果
选择排序耗时11ms
冒泡耗时6ms
插入排序耗时5ms
快速排序耗时8ms
系统排序耗时:0ms
显然,java jdk写的自然要比我这种泛泛之辈要好的太多了!