1.选择排序
先来说一下选择排序的基本思想:从数组的第一个数开始,将它与后面的每个数进行比较,如果比它小,就交换这两个数。这样一遍下来便可以找出最小的数了;接着从第二个数开始,重复第一个步骤。直到最后一个数,这样就完成了数组元素的排序。文字太抽象,上图吧。
/**
* 选择排序
* @param arr
*
*/
public void selectSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if (arr[i] > arr[j]) {
swpe(arr, i, j);
}
}
}
}
/**
* 交换数组两个位置的值
* @param arr
* @param index1
* @param index2
*/
public static void swpe(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
冒泡排序是两个相邻之间的数进行比较,0号元素与1号元素比较,1号元素与2号元素比较,以此类推。在比较的过程中,如果前面的数比后面的大,则交换两个数的位置。这样每轮下来都可以找到一个最大的数。循环完N(数组元素的个数)次之后完成排序。
/**
* 冒泡排序
*
* @param arr
*/
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
int last = arr.length;
int pos = 0;
while (last != 0) {
for (int i = 0; i < last - 1; i++) {
if (arr[pos] > arr[pos + 1]) {
swpe(arr, pos, pos + 1);
}
pos++;
}
pos = 0;
last--;
}
}
/**
* 交换数组两个位置的值
* @param arr
* @param index1
* @param index2
*/
public static void swpe(int[] arr, int index1, int index2) {
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
3.插入排序
插入排序基本思想:将整个待排序的数组看成左右两部分,其中左边为有序去,右边为无序区,整个排序过程就是将右边无序区中的元素逐个插入到左边的有序区中,已构成新的有序区。
比如说 3,1,5,9,7;首先将第一个元素作为划分点,接着将右边的数插入到左边去,如果能插到左边去的数已经全部完成,那么将划分点向右推移。3首先作为划分点,从3的后面第一个数开始,将旗标设置为该数,检查是否可以插入到左边去,则将它所在位置前面的数后移。然后将该数插入到它所应该在的位置。插入完毕之后将划分点向右推移。只有1需要移到左边,将3向右移动,腾出位置,1插入到3前面。接着3后面的5作为划分点,继续插入逻辑。直到最后一个元素,完成排序。
/**
* 插入排序
* @param arr
*/
public static void insertSort(int[] arr) {
/**
* 形成一个新的数组,用0号元素作为监岗哨
*/
int newLength = arr.length + 1;
int[] newArr = new int[newLength];
for (int i = 0; i < arr.length; i++) {
newArr[i + 1] = arr[i];
}
for (int i = 2; i < newLength; i++) {
// 设置旗标
newArr[0] = newArr[i];
// j指向前一个元素
int j = i - 1;
// i位置的元素要找到插入的位置,如果可以插入,则将插入位置后面的元素后移,腾出插入位置
while (newArr[j] > newArr[0]) {
newArr[j + 1] = newArr[j];
j = j - 1;
}
newArr[j + 1] = newArr[0];
}
for (int i = 0; i < arr.length; i++) {
arr[i] = newArr[i + 1];
}
}