目录
1.希尔排序的时间复杂度
3.有技巧的选择排序:堆排序
4.排序的种类
5.直接插入排序和冒泡排序
6.快速排序
7.希尔排序 堆排序 和快排的区别
8.为什么相遇位置一定比key小
9.快排的优化
11.快排递归写法的不足
12.快排的非递归解法
1.希尔排序的时间复杂度
大约在O(n^1.3) 比n*logn 略微大一点 ,不如堆排序 和快排
选择排序需要先选出数列的最大和最小下标,然后最大的放右边(交换),最小的放左边(交换)
然后缩小比较的范围left++ right-- ,在比较然后重置最小的最大的还未最左边的下标。
直到 left>=rights
void swap(int* arr2, int* arr1) { int temp = *arr2; *arr2=*arr1; *arr1 = temp; } void selectSort(int* arr, int n) { int left = 0; int right = n - 1; while (left < right) { int maxi = left; int mini = left; for (int i = left+1; i <= right; i++) { if (arr[maxi] < arr[i]) { maxi = i; } if (arr[mini] > arr[i]) { mini = i; } } swap(&arr[left], &arr[mini]); //修正 if(left==maxi) { maxi=left; } swap(&arr[right], &arr[maxi]); left++; right--; } }
选择排序的时间复杂度(On^2)
最坏N^2
最好N^2 因为是否接近有序都要进入循环
比较烂,无视数据是什么样子,都是O(N^2) 比没优化的插入排序还满了好多
在已经有序的情况下插入排序甚至比希尔排序好
3.有技巧的选择排序:堆排序
建立堆
选择
排升序建立大堆
堆的向下调整是从根开始
向上调整是从底部开始,堆的插入数据,放到堆尾,然后向上调整
n*logn 和 n^2 是 火箭和乌龟的区别
4.排序的种类
插入类:插入排序,希尔排序
选择类:选择排序,堆排序
交换排序:冒泡排序,快速排序
归并类:归并排序
5.直接插入排序和冒泡排序
最坏是n^2 最好是N
插入排序比冒泡好点,如果是完全有序的话两者一样
接近有序的话插入会比较好点。
一般的话都是插入比冒泡排序好,虽然都是N^2的量级
6.快速排序
比keyi严格小的在左边,比keyi严格大的在右边。相等的话无所谓继续走。
while里面套while如果子while对父while的条件有影响,那么要对父while的条件再判断
7.希尔排序 堆排序 和快排的区别
堆排序由于建立堆需要代价,所以在数据量特别大的时候并不如希尔排序 但还是差不多的
快排速度最快
8.为什么相遇位置一定比key小
左边做key,右边先走,相遇位置一定比key小。
9.快排的优化
1.取keyi的时候取中间大小的Keyi
2.数组长度小于10 /15 的时候选择插入排序
11.快排递归写法的不足
如果递归程度太深就会导致栈溢出,并且递归计算速度比较慢
12.快排的非递归解法
使用栈辅助改循环