一、冒泡排序
所谓冒泡排序,假设一个数组中有n个数要进行排列,那么它就要进行n轮相邻两位的对比,而每一轮对比后,最大的数都会放在最右边!
package Array;
import java.util.Arrays;
public class SortDemo {
public static void main(String[] args) {
int[] ary = new int[]{1, 5, 7, 8, 3};
// Arrays.sort(ary); 实现列表排序,从小到大,自带方法
// System.out.println(Arrays.toString(ary));
ary = Fun(ary);
System.out.println(Arrays.toString(ary));
}
// 冒泡排序
public static int[] Fun(int[] ary){
// 下标i来控制比较多少轮
for(int i=0;i<ary.length;i++){
// 设置数组是否有序标记
boolean flag = false;
// 下标j用来控制要比较的数据,注意这里是arr.length-i-1
for(int j=0;j<ary.length-i-1;j++){
if(ary[j]>ary[j+1]){
// 如果左边比右边大,交换两数位置
int temp = ary[j];
ary[j] = ary[j+1];
ary[j+1] = temp;
flag = true;
}
}
if(!flag){
break; // 此时数组已然有序,退出循环
}
}
return ary;
}
}
二、选择排序
每个元素都和第一位进行比较,如果左边的比右边的大,交换位置,.一轮之后,最小的在最左边,那么n-1轮之后,完成排序。
// 选择排序
public static int[] Fun1(int[] ary){
for(int i=0;i<ary.length-1;i++){
for(int j=i+1;j<ary.length;j++){
if(ary[i]>ary[j]){
int t = ary[i];
ary[i] = ary[j];
ary[j] = t;
}
}
}
return ary;
}
三、插入排序
先把数组分二半,默认情况下,以左边第一个数分开。从右边按序取出一个数,和左边比,放到合适的位置,n-1轮后,完成排序。
// 插入排序
public static int[] Fun2(int[] ary){
int j=0; // j为左边数组下标
for(int i=1;i<ary.length;i++){ // i为右边数组依次取出
int temp = ary[i];
//i是左,j是右 让小的在左边
for(j=i-1;j>=0;j--){
if(temp<ary[j]){
ary[j+1] = ary[j];
ary[j] = temp;
}else{
break;
}
}
}
四、快速排序
选一中间数,默认为数组的第一个,中间数左边的是小于中间数的数,右边是大于中间数的数,左边和右边没有排序的,只是简单的大于或小于中间数,再把左边,分二半,以一个数为中间,再左边是小,右边的大的,右边同理,一直递归下去.,直到序列有序。
package Array;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] ary = new int[]{1, -1, -5, 0, 5, 67};
quickSort(ary, 0, ary.length-1);
System.out.println(Arrays.toString(ary));
}
public static void quickSort(int[] ary, int left, int right){
if(left>right)
{
return;
}
// 默认以第一个数为基数
int base = ary[left];
int i = left;
int j = right;
while(i!=j){
while(ary[j]>=base && i<j){
j--;
}
while(ary[i]<=base && i<j){
i++;
}
// 两个循环都停止说明i和j都找到了对应的数,此时交换两数位置
int temp = ary[i];
ary[i] = ary[j];
ary[j] = temp;
}
// 跳出循环后,说明i和j相遇了,此时交换基数和相遇位置的那个数
ary[left] = ary[i];
ary[i] = base;
// 排出base左边的数
quickSort(ary, left, i-1);
// 排右边的数
quickSort(ary, j+1, right);
}
}