一:直接插入排序
1:思想
- 首先选择一个哨兵,我们默认将第一个数作为哨兵,随着循环的进行,我们一直将我们待插入数的前一个数作为哨兵
- 然后就是插入的数与哨兵比较,比哨兵小的话,就将哨兵后移,然后再与哨兵前面的数进行比较,直到遇见一个比起小的的树,停止比较,将要插入树插入到这。
大白话就是打扑克,给扑克牌进行排序。
2:上码
public static void directInsertSort1(int arr[]) {for (int i = 1; i < arr.length; i++) {int point = arr[i];int j = i-1;// i-1下标代表的元素就是下标while (j >= 0 && arr[j] > point) {//while循环直到找到合适的插入位置arr[j+1] = arr[j];//将比要插入数 大的数 往后移动j--;//继续往前寻找比起小的数}//当遇见比起小的数时候,跳出了循环,但是我们需要在其后面进行插入arr[j+1] = point;}
}
3:时间复杂度
平均时间复杂度:O(n^2);
最好时间复杂度:O(n);
最坏时间复杂度:O(n^2);
二:希尔排序
1:算法思想
将整个待排序列分成若干个子序列(这个子序列是间隔"增量元素"形成的),然后再对这些子序列中的元素进行排序,然后下一轮我们再以将增量/2再进行划分子序列,我们再对子序列进行排序。
直到最后增量为1的时候来次大排序。这个在排序的时候,我们是用简单插入排序的;
(这个希尔排序的话主要是对简单插入排序的优化,如果直接是简单插入排序的话, 效率在序列是基本有序的情况下是很高的,但是我们不能保证每次序列都是基本有序的)
2:图示
3:上码
public static void shellSort1(int arr[]) {for (int gap = arr.length / 2; gap > 0; gap = gap / 2) {for (int i = gap; i < arr.length; i++) {int left_index = i - gap;//待排子序列的前一个元素int point = arr[i];//待插入元素while (left_index >= 0 && arr[left_index] > point) {arr[left_index + gap] = arr[left_index];left_index = left_index - gap;}arr[left_index+gap] = point;//当跳出while循环,那就是遇见了一个//比point小的数,那么我们就要在} //该数后面插入一个数,(因为是在子序列中//所以加上gap )}}