一.冒泡排序
冒泡排序基本思想:所谓冒泡排序就是依次将两个相邻的数进行比较,例如降序:大的在前面,小的在后面。即先比较第1个数和第2个数,大数在前,小数在后,然后比较第2 个数和第 3 个数,直到比较最后两个数。
![](https://i-blog.csdnimg.cn/blog_migrate/e166b05bf5e3346b396c0b0a3f06aead.png)
static void bubble_Sort(int []arr){
//比较轮数
for (int i=0; i<arr.length-1; i++){
//两两进行比较
for (int j=0; j<arr.length-1-i; j++){
if (arr[j]>arr[j+1]){
int temp = arr[j];
arr[j] = arr [j+1];
arr[j+1] = temp;
}
}
}
}
二.选择排序
选择排序基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,按照顺序放在待排序的数列的最前,直到全部待排序的数据元素排完。
![](https://i-blog.csdnimg.cn/blog_migrate/7020a6e6fc8feb5dc5411cadec5a3a58.png)
static void select_Sort(int []arr){
//排序次数
for (int i=0; i<arr.length-1; i++){
int min=i;
//从i开始和后面进行比较
for (int j=i+1; j<arr.length; j++){
//如果有比arr[i]小的就把他的下标拿出来继续和后面比较
if (arr[j]<arr[min])
min=j;
}
if (min!=i) {
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
}
三.插入排序
插入排序基本思想:假设待排序的数据存放在数组 a[1…n]中,增加一个节点 x 用于保存当前数据,进行比较,a[1]即作为有序区,a[2…n] 作为无序区。从 i=2 起直至 i=n 为止,通过循环遍历,将a[i] 放在恰当的位置,使 a[1…i] 数据序列有序。
![](https://i-blog.csdnimg.cn/blog_migrate/97bed6d235b8e65c83b1b13dca9832e5.png)
static void insert_sort(int []arr){
for (int i=0; i<arr.length; i++){
//首先定义一个待插入的数
int insertData = arr[i];
//索引前面的下标
int index = i-1;
while (index>=0 && insertData<arr[index]){
arr[index+1] = arr[index];
index--;
}
arr[index+1] = insertData;
}
}
四.希尔排序
希尔排序基本思想:希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法,同时也突破了之前内排序算法复杂度为O(n2)的限制。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
2.插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
排序过程:
1.先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
2.因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
3.其中增量序列的选择是非常关键的,但通常我们取步长为n/2(数组长度的一般)然后一直取半直到 1。
static void shellSort(int []arr){
int gap = arr.length/2;
while (gap>0){
for (int i=gap; i<arr.length; i++){
for (int j=i-gap; j>=0; j=j-gap){
if (arr[i]<arr[j]){
int temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
gap/=2;
}
}