数据结构作业9:排序
选择排序
(类似冒泡,每次扫描最小的数字 记下下标)
希尔排序
** for(for(for(if)))**)
public static int[] insertionSort(int[] arr){
if(arr == null || arr.length <= 1){
return arr;
}
//希尔排序 升序
for (int d = arr.length / 2;d>0;d /= 2){ //d:增量 7 3 1
for (int i = d; i < arr.length; i++){
//i:代表即将插入的元素角标,作为每一组比较数据的最后一个元素角标
//j:代表与i同一组的数组元素角标
for (int j = i-d; j>=0; j-=d){ //在此处-d 为了避免下面数组角标越界
if (arr[j] > arr[j + d]) {// j+d 代表即将插入的元素所在的角标
//符合条件,插入元素(交换位置)
int temp = arr[j];
arr[j] = arr[j + d];
arr[j + d] = temp;
}
}
}
}
return arr;
}
快速排序
(分而治之,类似二叉树,找一个标准,大于放其右,小于放其左)
https://www.bilibili.com/video/BV1b7411N798?p=81&share_source=copy_web
归并排序
(反二叉树,由根到总)
对N个记录进行归并排序,归并趟数的数量级是: O(logN)
——————————————————————————————————————————————————————————————
1.采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是: [C]
A. 每次划分后,先处理较长的分区可以减少递归次数
B. 每次划分后,先处理较短的分区可以减少递归次数
C. 递归次数与每次划分后得到的分区处理顺序无关
D. 递归次数与初始数据的排列次序无关
2.
要从50个键值中找出最大的3个值,选择排序比堆排序快。
3.
对N个元素采用简单选择排序,比较次数和移动次数分别为:A
A.O(N2), O(N) B.O(N), O(logN)
C.O(logN), O(N2) D.O(NlogN), O(NlogN)
4.
数据序列{ 3, 1, 4, 11, 9, 16, 7, 28 }只能是下列哪种排序算法的两趟排序结果?D
A.冒泡排序
B.快速排序
C.插入排序
D.堆排序
冒泡排序、堆排序 每次排序都会有一最大/小值排到最前/后面 插入排序 两趟排序会有2个排好的元素在前/后面
5.
排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一“趟”。下列序列中,不可能是快速排序第二趟结果的是:D
A.5, 2, 16, 12, 28, 60, 32, 72
B.2, 16, 5, 28, 12, 60, 32, 72
C.2, 12, 16, 5, 28, 32, 72, 60
D.5, 2, 12, 28, 16, 32, 72, 60
6.
对N个记录进行归并排序,归并趟数的数量级是:A
A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N2)