算法篇
三种简单排序
一、选择排序
算法核心: 将数组中所有元素进行比较,获取最小元素所在下标,并将最小元素与数组首元素进行交换,此时数组中第一个元素为最小元素;继而从第二个元素开始,再次进行比较后获取剩下元素中最小元素所在下标,将其与数组中第二个元素进行交换;以此类推,最终将数组按照从小到大排序完成。
核心代码如下:
//arr为需要排序的数组
for(int i = 0; i < arr.length; i++) {
//index表示元素最小下标,并初始index = i,将其与后面所有元素进行比较
int index = i;
for (int j = i + 1; j < arr.length; j++) {
//获取到小得元素将其下标赋给index,保证index在每次比较中都是小的
index = arr[index] > arr[j] ? j : index;
}
//简单的数交换方法,将最小值与i位置的数据进行交换
swap(arr, i , index);
}
二、冒泡排序
算法核心: 将数组首元素与第二个元素进行比较若首元素大,则交换两元素位置,若首元素小则位置不变;而后将第二个元素与其后面的元素(第三个元素)进行比较,交换规则同前,按照此规则在所有元素比较完成后则数组末尾为最大值的元素;继续进行第二轮比较后数组倒数第二位的元素为整个数组中第二大的数;以此类推最终数组元素从小到大排序完成。
核心代码如下:
//end初始化为数组末尾元素,一次循环后数组最后一个位置值最大,再次循环时只将0 ~ end-1的元素进行比较即可,以此类推
for (int end = arr.length - 1; end >= 0; end--) {
//每次循环比较的次数都是end次
for (int j = 0; j < end; j++) {
if (arr[j] > arr[j + 1])
//交换函数
swap(arr, j , j + 1);
}
}
三、插入排序
算法核心: 数组中第二个元素与第一个元素进行比较,如果第二个元素小则二者交换,如果第二个元素大则位置不变,取出第三个元素与第二个元素进行比较,若其小则交换,交换后继续与第一个元素进行比较,若其小则继续交换;若第三个元素与第二个元素比较后其值大则该元素比较结束,取第四个元素进行比较,比较规则同前,最终数组按照从小到大进行排序完成。
核心代码如下(以下写法均可以实现):
方法I:
for(int end = 1; end < arr.length; end++) {
//将end赋值给Index,Index表示目前的插入的位置,第一次循环时插入的为第二个元素
int newNumIndex = end;
//当插入的元素左边还有数据并且其左边的数据比起大,则进行交换
while(newNumIndex - 1 >= 0 && arr[newNumIndex] < arr[newNumIndex - 1]) {
swap(arr, newNumIndex - 1, newNumIndex);
newNumIndex--;
}
}
方法II:
for(int end = 1; end < arr.length; end++) {
//当插入的元素左边还有数据并且其左边的数据比起大,则进行交换
for(int pre = end; pre - 1 >= 0 && arr[pre] < arr[pre - 1]; pre--) {
swap(arr, pre, pre - 1);
}
}