排序算法
剑决浮云气
事了拂衣去,深藏功与名
展开
-
相邻两数的最大差值
给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。解题1.已知数组长度为 N2.遍历数组,找到整个数组中元素的最大值 max 和最小值 min3.最小值放入0号桶,最大值放入N+1号桶根据找到的 max 和 min,将数组均匀划分为 n + 1 个范围。4.遍历数组,根据每个数组元素的值,判断需要进入哪个桶,最后找到每个桶中的最大值和最小值。5.遍历数组 用该数组的最小值-前一个非空桶的最大值,更新全局Max(最大差值)设立N+1个桶的原创 2021-01-26 17:13:07 · 352 阅读 · 0 评论 -
桶排序
是将[0,1]区间划分为n个等长的子区间。然后,将各个元素按照自己所属的区间放入相应的桶中,只需要将每个桶的元素排好序,依次输出各个桶内的元素,就得到了有序的元素序列不基于比较的排序#include<iostream>using namespace std;int main(){ int book[1001],i,j,t,n; for(i = 0;i <= 1000; i++)//桶的个数 book[i]=0;//先初始化为0 scanf("%d",&原创 2021-01-26 15:28:05 · 59 阅读 · 0 评论 -
工程上的排序算法
1、若你需要排序的是基本数据类型,则选择快速排序。若你需要排序的是引用数据类型,则选择归并排序。(基于稳定性考虑)可以去参考一下排序稳定性的概念,基本数据类型相同值,谁前谁后无意义因为基本数据类型之间无差异,不需要考虑排序算法稳定性,而归并排序则可以实现算法的稳定性。2、当你需要排序的样本数量小于60,直接选择插入排序,虽然插入排序的时间复杂度为O(N²),我们是忽略常数项得出来的O(N²),但在基数60以内,插入排序的时间复杂度为O(N²)的劣势体现不出来,反而插入排序常数项很低,原创 2021-01-26 14:52:58 · 212 阅读 · 0 评论 -
堆排序 大根堆
#include <iostream>#include <algorithm>using namespace std; #define MAX 100010int Heap[MAX];//Heap[i]的孩子是 2*i+1 2*i+2 父亲是(i-1)/2 int HeapSize = 0;//初始化堆的大小 void HeapInsert(int Index);//对Index位置上的数进行插入void Heapify(int Index); int main原创 2021-01-25 17:01:41 · 99 阅读 · 0 评论 -
快速排序
#include<bits/stdc++.h> using namespace std;#define MAX 100005int N;int nArr[MAX];void quick_sort(int q[], int l, int r){ //递归的终止情况 if(l >= r) return; //第一步:分成子问题 int i = l - 1, j = r + 1, x = q[l + r >> 1]; whi原创 2021-01-25 15:31:37 · 71 阅读 · 0 评论 -
荷兰国旗问题
问题描述给定一个数组a和一个数n,把小于等于n的数字放在数组的左边,大于n的数放在数组的右边,要求额外空间复杂度O(1),时间复杂度O(n)#include <iostream>using namespace std; const int N = 100010;int Arr[N];void Sort(int *p, int nStart, int nEnd, int nFlag);int main(int argc, char** argv) { int nLen;原创 2021-01-25 11:00:26 · 90 阅读 · 1 评论 -
数组分组问题
问题描述给定一个数组arr,和一个数num,请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)#include <iostream>using namespace std; const int N = 100010;int Arr[N];void Sort(int *p, int nStart, int nEnd);int main(int argc, char** argv) {原创 2021-01-25 10:16:11 · 152 阅读 · 0 评论 -
归并排序
#include <iostream>using namespace std;const int N = 100010;int Arr[N];int Temp[N];void Merge(int *p, int nLeft, int nMid, int nRight);void MergeSort(int *p, int nLeft, int nRight); int main(int argc, char** argv) { int nSize; scanf("%d"原创 2021-01-24 20:14:11 · 70 阅读 · 0 评论 -
插入排序
#include <iostream>using namespace std;const int N = 100010;int Arr[N];void InsertSort(int *p, int nLen); int main(int argc, char** argv) { int nLen; scanf("%d",&nLen); for(int i = 0; i < nLen; i++) { scanf("%d",&Arr[i]);原创 2021-01-24 17:10:54 · 65 阅读 · 0 评论 -
选择排序
#include <iostream>#include <algorithm>using namespace std;const int N = 100010;int Arr[N];void MySort(int *p, int nLen); int main(int argc, char** argv) { int nLen; scanf("%d",&nLen); for(int i = 0; i < nLen; i++) { sc原创 2021-01-24 16:55:21 · 53 阅读 · 0 评论 -
冒泡排序
#include <iostream>using namespace std;const int N = 100010;int Arr[N];void MySort(int *p, int nStart, int nEnd);int main(int argc, char** argv) { int nLen = 0; scanf("%d",&nLen); for(int i = 0; i < nLen; i++) { scanf("%d",&am原创 2021-01-24 16:38:09 · 54 阅读 · 0 评论