十大排序介绍
冒泡排序 选择排序 插入排序 复杂度 n*n
快速排序(pivot,quick) 堆排序 希尔排序(gap) 归并排序 复杂度n*logn
桶排序 计数排序 基数排序 复杂度 n---
其中主要需掌握的重要的有冒泡和计数排序,其他的需了解其排序原理即可。
1、冒泡排序
1、两两对比,往后挪用,最后最大的在末尾,如数组1,9,8,7,6,先对比1和9;
然后9放后面,再对比9和8,9继续放后面.....
package day07.work;
import java.util.Arrays;
public class HomeWork {
public static void main(String[] args) {
int[] nums = {8,4,6,9,2,7,5,9,4,6,3,120};
//5、利用冒泡排序对数据进行降序排序
for(int i=0;i<nums.length-1;i++) {
//该循环控制循环的轮数,即为需多少轮才能对比完,一次轮完送到头一个最大值;
for(int j=0;j<nums.length-1-i;j++) {
//内层循环控制每轮对比的次数,如三个数据对比两次,第一个数据若最大只需对比两次冒泡到最后,-1是最后一次无需再轮,已经在最前面了而且不-1会导致下标越界最后一次应该是 length-1下表和length-2下标作大小比较;
if(nums[j]<nums[j+1]) {//前一个数小于后一个数,则互换,进行降序排序
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
System.out.println("冒泡排序后的数组为"+Arrays.toString(nums));
}
}
冒泡排序由于其算法比较多余,占用线程时间特别长,一旦数据量大运行耗时特别长,几乎不怎么见到应用实例,但因其比较经典,所以需知道其原理并会编写该代码;
java中数组也自带有排序方法Arrays.sort(数组名,从哪个位置开始,到哪个位置结束);
该方法比冒泡排序快;
2、计数排序
计数排序只适用于明确知道范围的、固定范围内的整数排序;比如需要对一组年龄数据排序,明确知道人的年龄为(0,100】,(不要杠我的100岁)就定义一个100个长度的数组,依次存放1-100岁的各个年龄的人数,然后再还原出来数组,也可以得到每个范围(0-10】年龄人数占比之类的。
package week02.day08.test;
import java.util.Arrays;
public class CountSort {
public static void main(String[] args) {
int[] nums = {1,3,3,5,6,1,2,2,3,5,6,6,5,2,1,3,3,1};
int[] counts = new int[6];//数值的最大值为几个,则定义count长度为几个
for(int i=0;i<nums.length;i++) {
counts[nums[i]-1]++;//算出count中下标为某个数的有多少个算出
}
//下面打印一下目前counts数组内容,还需要将其还原;
System.out.println(Arrays.toString(counts));
int a=0;//存放新数组的序号;
for(int i=0;i<counts.length;i++) {// 循环录入某个值的动作 即外层循环控制多少种 循环录入某个值
for(int j=0;j<counts[i];j++) {
nums[a++] = i+1; //counts数组的i下标的值 代表的是在nums数组中有下标i的值这样多的i+1的值;
//比如counts 0下标值为5,说明nums中有5个 0+1=1的值所以这里值为i+1;
}
}
System.out.println(Arrays.toString(nums));
}
}
3、选择排序
选择排序思想是将先循环找到数组中最小(最大都行,看自己升序或降序)的数值,将它放置到第一个元素位置,然后再循环剩下的找到最小那个,再放置到第二个位置,以此循环。它的思想和冒泡排序很像,只是它过程中记录每次循环的最小值下标,循环一次后再将目前循环到的第一个位置去互换;
package week02.day07.sort;
import java.util.Arrays;
public class Choosesort {
//选择排序
public static void main(String[] args) {
int[] nums = {1,6,87,45,234,21,4,128,2};
for(int i=0;i<nums.length-1;i++) {
int minIndex = i;
for(int j =i+1;j<nums.length;j++) {
if(nums[minIndex]>nums[j]) {
minIndex = j;
}
}
int temp =nums[minIndex];
nums[minIndex] =nums[i];
nums[i] = temp;
}
System.out.println(Arrays.toString(nums));
}
}
4、插入排序
插入排序思想是将前面的看成是已有序的数组,后面循环一个去前面里找位置然后插入;
5、快速排序
6、堆排序
7、希尔排序
8、归并排序
9、桶排序
中心思想是按范围划分进桶,比如一组数据0-100,我分成10个桶,每个桶存放10个范围内数据,然后在每个桶进行排序;