常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:
1.1 冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地遍历待排序的列表,比较相邻的元素并交换它们的位置来实现排序。该算法的名称来源于较小的元素会像"气泡"一样逐渐"浮"到列表的顶端。
public static void sort(int[] arr) {
for(int i=0;i<arr.length-1;i++) {
for(int j=0;j<arr.length-i-1;j++) {
if(arr[j]>arr[j+1]) {
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
2、选择排序(Selection Sort)
算法步驟
- 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置;
- 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾;
- 重复第2步,直到所有元素均排序完毕。
// private static void sort(int[] arr) {
// // TODO Auto-generated method stub
// for(int i=1;i<arr.length;i++) {
//
// for(int j=i-1;j>=0;j--) {
// if(arr[j]>arr[j+1]) {
// int a =arr[j];
// arr[j]=arr[j+1];
// arr[j+1]=a;
//
// }
// else {break;}
//
//
// }
// }
//
//
// }
3、插入排序(Insertion Sort)
算法步驟
首先从第一个元素开始,该元素被认为是有序的;
取出下一个元素,在已经排序的元素序列中从后往前进行扫描;
如果该已排好序的元素大于新元素,则将该元素移到下一位置;
重复步骤3一直往前进行扫描比较,直到找到已排序的元素小于或者等于新元素的位置;
将新元素插入到该位置后;
重复步骤2~5。
public class InsertionSort {
public static void insertionSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int val = arr[i], j = i;
while (j > 0 && val < arr[j - 1]) {
arr[j] = arr[j - 1];
j--;
}
arr[j] = val;
}
}
}
4、希尔排序(Shell Sort)
算法步驟
选择一个增量序列{t1, t2, …, tk};
按增量序列个数k,对序列进行k趟排序;
每趟排序,根据对应的增量t,将待排序列分割成若干长度为m的子序列,分别对各子表进行直接插入排序。仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。
其中,增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2, (n/2)/2, …, 1},称为增量序列。一般的增量序列都选择以上说明的这个,但不一定是最优的。
public static void sort(int[] arr) {
// for(int i=arr.length/2;i>=1;i--) {
// for(int j=i;j<arr.length;j++) {
// for(int k=j-i;k>=0;k=k-i) {
// if(arr[k]>arr[k+i]) {
//
// int temp=arr[k];
// arr[k]=arr[k+i];
// arr[k+i]=temp;
//
//
// }
//
//
//
// }
//
//
//
// }
//
//
// }
//
//
//
//
// }