一、冒泡排序
1、原理:
将给定的数组中的元素按从小到大的顺序排列,冒泡排序是从第一个元素开始相邻两个元素比较,将值大的那个元素往后挪,这样一遍下来,数组中最大的元素就放在了最后一个位置上;第二遍遍历同上,但只比较到倒数第二个位置,将找到的最大值放在倒数第二个位置上,以此类推。过程可看图示:
2、代码如下:
public class Sort {
public static void main(String[] args) {
//冒泡测试
int[] arr = new int[]{12, 5, 7, 89, 54, 32, 13};
BubbleSort(arr);
System.out.println(Arrays.toString(arr));
}
/*1、冒泡排序*/
private static void BubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {//循环次数
boolean flag = false;
for (int j = 0; j < arr.length - 1 - i; j++) {//第一遍循环
if (arr[j+1] < arr[j]) {
flag = true;
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
if(!flag){
return;
}
}
}
}
二、选择排序
1、原理:
将给定数组中的元素从小到大的顺序排序,选择排序是将数组遍历,第一遍找到最小值,将最小值与第一个元素交换位置;第二遍从第二个元素往后找,找到最小值与第二个元素交换位置,以此类推,过程如图:
2、代码如下:
public class Sort {
public static void main(String[] args) {
//插入排序测试
int[] arr = new int[]{12, 5, 7, 89, 54, 32, 13};
SelectSort(arr);
System.out.println(Arrays.toString(arr));
}
/*2、选择排序*/
private static void SelectSort(int[] arr){
for(int i = 0;i < arr.length - 1;i++){//遍历趟数
int min = arr[i];
int now = i;
for(int j = i+1;j < arr.length;j++){//某一趟找最小值
if(arr[j] < min){
min = arr[j];
now = j;
}
}
//找到最小值后交换
if(now != i){
int temp = arr[i];
arr[i] = arr[now];
arr[now] = temp;
}
}
}
}
三、插入排序:
1、原理:
将给定数组中的元素按照从小到大的顺序排序,默认第一个元素是有序的,其他元素从后往前一一对比大小,比该位置元素小就继续往前比较,找到合适位置,然后将之前比较过的大于该元素的位置顺次往后移动,将该元素插入到小于该元素的后面。过程如图:
2、代码如下:
public class Sort {
public static void main(String[] args) {
//插入排序测试
int[] arr = new int[]{12, 5, 7, 89, 54, 32, 13};
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
/*插入排序*/
private static void insertSort(int[] arr){
for(int i = 1;i < arr.length;i++){
int val = arr[i];
// 在i前面已经排序好的序列中,找i元素插入的合适的位置
int j=i-1;
for(; j>=0; --j){
if(val < arr[j]) {
arr[j+1] = arr[j];
}
else {
break;
}
}
// 把val元素插入到当前位置,然后循环结束
arr[j+1] = val;
}
}
}
至于查找时可以用二分查找对直接插入排序进行优化,代码如下:
private static void InsertSort(int[] arr) {
for(int i=1; i<arr.length; ++i) {
int val = arr[i];
// 优化成二分查找合适的插入位置,不再使用线性查找
// 0 j 找第一个小于val的值
int index = findInsertPos(arr, 0, i-1, val);
for(int j=i; j>index; --j){
arr[j] = arr[j-1];
}
arr[index] = val;
}
}
private static int findInsertPos(
int[] arr, int i, int j, int val) {
while(i <= j)
{
int mid = (i+j)/2;
if(val < arr[mid])
{
j = mid-1;
} else {
i = mid+1;
}
}
return i;
}