常用排序算法代码实现(一)
本文仅提供代码实现,建议先熟知其原理再看代码(排序顺序从小到大)
{ 22, 33, 77, 32, 11, 66, 88, 3, 2, 99, 44, 55, 0 }
1.选择排序
选择排序很容易和插入排序搞混,但是它们两还是有很大不同的,选择排序的算法的核心(比如从第一个数22开始,从22后面的所有数中选择出一个最小的数,然后22和这个最小的数进行交换位置,然后开始以33比较)
private static void selectSort(int[] arr) {
if (null == arr || arr.length < 2) // 数组是空或者数组里面只有一个元素,没必要排序
return;
for (int i = 0; i < arr.length - 1; i++) { // 最后一个元素没必要再给它排序,因为比较完前面的数后它就已经是最大的了
int minIndex = i; // 初始的时候就认为最小值索引指针在i位置,最小值就是arr[i]
for (int j = i + 1; j < arr.length; j++) { // 在I后面[i+1,arr.length-1]区间找最小的值
minIndex = arr[j] < arr[minIndex] ? j : minIndex;// 找到就把最小值索引跟新,找不到最小值索引还在原位
}
int temp = arr[i]; // 将i位置上的元素值和最小索引位置的元素值交换
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
for (int i : arr) {
System.out.print(i + "\t");
}
}
2.冒泡排序
private static void bubbleSort(int[] arr) {
/*
* 1.比较多少趟的问题,从第一个开始,和后面的数比,如果后面的数更小,那么就交换位置,
* 依次比较,比较完倒数第2个数就不用比较了,因为此时已经是排序好的了。所以一共是arr.length-1趟
*/
for (int i = 0; i < arr.length-1; i++) {
/*
* 2.每趟需要比较的次数:
* 第一个数需要比较的次数是arr.length-1次,往后的每个数比较的次数都减一次
*/
//j从第2个数开始比较,比较次数从arr.length-1次开始递减
for(int j=1;j<arr.length-i;j++) {
if (arr[j-1]>arr[j]) {
int temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
}
}
}
for (int i : arr) {
System.out.print(i+":");
}
}
3.插入排序
插入排序将待排序的数分为两部分,一部分是已排序,一部分是未排序的,原理就是从未排序里逐一取出插入到已经排序好的部分。
private static void insertSort(int[] arr) {
//插入排序是将数组分为两部分,前面一部分是有序数组,后一部分为待排序数组
//首先,插入排序是从第二个数开始拿的,然后和第一个数进行比较,所以,走的趟数为length-1次。
for (int i = 1; i < arr.length; i++) {
//想想排序的过程,先拿到要比较的这个索引,然后和前一个位置的元素进行比较,如果比前一个小,就交换位置,循环执行
int curIndex=i;
while (curIndex>0&&arr[curIndex]<arr[curIndex-1]) {
int temp=arr[curIndex];
arr[curIndex]=arr[curIndex-1];
arr[curIndex-1]=temp;
curIndex--;
}
}
for (int i : arr) {
System.out.print(i+":");
}
}
未完待续…