1.插入排序
概念:将每一个后排元素插入到前排已经有序的牌中的适当位置,称之为插入排序。
过程简单描述:
1、从数组第2个元素开始抽取元素。
2、把它与左边第一个元素比较,如果左边第一个元素比它大,则继续与左边第二个元素比较下去,直到遇到不比它大的元素,然后插到这个元素的右边。
3、继续选取第3,4,….n个元素,重复步骤 2 ,选择适当的位置插入。
注解版:
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; ++i) {//常规操作
int key = arr[i];//需要先把值取出来不然就被覆盖了,额外空间+1
// 将arr[0..i-1]中大于key的元素向后移动一位
int j = i - 1;//排序算法都是二维的,肯定有个j。
while (j >= 0 && arr[j] > key) {//条件最重要,当符合这些条件就做以下操作。
arr[j + 1] = arr[j];//两步目的是让元素往后移。
--j;
}
arr[j + 1] = key;//把取出来的值再放回去
}
}
简洁版:
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; ++i) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
--j;
}
arr[j + 1] = key;
}
}
}
2.选择排序
概念:每次从待排序列中选出一个最小值,然后放在序列的起始位置,直到全部待排数据排完即可。
过程简单描述:
首先,将0号元素取出来默认为最小值。其次,那这个值跟后面所有值比较,如果大就交换,一直到数组结尾。最后将找到的这个最小值放到0号元素。循环做这个事,做到倒数第一个元素或者倒数第二个元素(猜猜为啥)。
public static int[] selectSort(int[] arr) {
for(int i=0; i<arr.length-1;i++){
int min=arr[i];
for(int j=i+1; j<arr.length;j++){
if(min>arr[j]){//找出最小的交换位置
int temp=min;
min = arr[j];
arr[j]= temp;
}
}
arr[i]= min;//把最小的放到这个位置
}
return arr;
}
public static int[] selectSort(int[] arr) {
for(int i=0; i<arr.length-1;i++){
int min=arr[i];
for(int j=i+1; j<arr.length;j++){
if(min>arr[j]){
int temp=min;
min = arr[j];
arr[j]= temp;
}
}
arr[i]= min;
}
return arr;
}
3.冒泡排序
概念:就像水中的气泡一样,每次我都把最大的或最小的放到最后面。
过程简单描述:
遍历未被固定的那些数,让最大的数升到最右边固定起来,但这个升的过程是仅前一个和后一个互换位置,这点是与选择排序的区别,这也是冒泡排序稳定但选择排序不稳定的原因,因为选择排序是跳跃着互换,很容易将原有的顺序打乱。多次循环遍历结束后,所有的数就排好序了。
public static int[] maoPaoSort(int[] arr) {
for(int i=arr.length-1; i>0;i--) {
for (int j=0; j<i; j++) {
//主要是这里,要把最大值放到后面,并且放好的不能动了,那一定不是小于N而是小于一个动态的数,
//那这个是数是靠i来控制的。
if(arr[j]>arr[j+1]){
int temp= arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}
public static int[] maoPaoSort(int[] arr) {
for(int i=arr.length-1; i>0;i--) {
for (int j=0; j<i; j++) {
if(arr[j]>arr[j+1]){
int temp= arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
return arr;
}