牛客网算法学习记录-排序2
来源:互联网 发布:淘宝网旗袍金丝绒 编辑:程序博客网 时间:2024/05/17 21:48
已知一个几乎有序的数组,几乎有序是指,如果把数组排好顺序的话,每个元素移动的距离可以不超过k,并且k相对于数组来说比较小。请选择一个合适的排序算法针对这个数据进行排序。
给定一个int数组A,同时给定A的大小n和题意中的k,请返回排序后的数组。
[2,1,4,3,6,5,8,7,10,9],10,2
返回:[1,2,3,4,5,6,7,8,9,10]
对于步长有限定的一般选用局部堆排序。基本有序的可以选用插入排序
//构建小根堆
void minHeap(vector<int> &B,int n){
int i;if(n%2==0){
i = (n-2)/2;
}
else{
i = (n-1)/2;
}
for(;i>=0;i--){
adjustHeap(B,i,n);
}
}
//注意vector和数组不同的是,参数要有&才能传递指针
//数组下标从0开始
void adjustHeap(vector<int> &B,int i,int n){int j = 2 * i +1 ,flag = 1;
//注意边界
while(2*i+1<n&&flag){if(2*i+1<n-1&& B[2*i+1]>B[2*i+2]){
j = 2*i+2;
}
else{
j = 2*i+1;
}
if(B[i]>B[j]){
int t = B[i];
B[i] = B[j];
B[j] = t;
i = j;
}
else{
flag = 0;
}
}
}
// write code here
vector<int> B(k); //需要初始化
for(int i = 0 ; i<k;i++){
B[i] = A[i];
}
minHeap(B,k);
for(int i = 0 ; i<n-k;i++){
A[i] = B[0];
B[0] = A[i+k];
adjustHeap(B,0,k);
}
//对最后的K个元素进行排序和小根堆的调整
for(int j=n-k;j<n;j++){
A[j] =B[0];
if(j==n-1)
break;
B[0]=B[--k];
adjustHeap(B,0,k);
}
return A;
}
请设计一个高效算法,判断数组中是否有重复值。必须保证额外空间复杂度为O(1)。
给定一个int数组A及它的大小n,请返回它是否有重复值。
[1,2,3,4,5,5,6],7
返回:true空间复杂度为1 即只能用常数个辅助空间,一般就是堆排序或者插入排序之类的
bool checkDuplicate(vector<int> a, int n) {
// write code here
int flag = 0,count=0;
minHeap(a,n);
for(int i = n-1;i>=0;i--){
int t = a[0];
a[0] = a[i];
a[i] = t;
count++;
if(count>1){
//为了能提前退出
if(a[i] == a[i+1]){
flag = 1;
break;
}
}
adjustHeap(a,0,i);
}
if(flag){
return true;
}
else{
return false;
}
}
void minHeap(vector<int> &a,int n){
int i;
if(n%2==0){
i = (n -2)/2;
}
else{
i = (n-3)/2;
}
for(;i>=0;i--){
adjustHeap(a,i,n);
}
}
void adjustHeap(vector<int> &a,int i ,int n){
for(int j= i*2+1;j<n;j=j*2+1){
if(j+1<n&&a[j]>a[j+1]){
j = j+1;
}
if(a[i]>a[j]){
int t = a[i];
a[i] = a[j];
a[j] = t;
i=j;
}
}
}
有两个从小到大排序以后的数组A和B,其中A的末端有足够的缓冲空容纳B。请编写一个方法,将B合并入A并排序。
给定两个有序int数组A和B,A中的缓冲空用0填充,同时给定A和B的真实大小int n和int m,请返回合并后的数组。
int* mergeAB(int* A, int* B, int n, int m) {
// write code here
if(m==0){
return A;
}
if(n==0){
return B;
}
int index = m+n-1;
int i,j;
for( i = n-1,j=m-1;i>=0&&j>=0;){
if(A[i]<B[j]){
A[index] = B[j];
j--;
index--;
}
else{
A[index] = A[i];
i--;
index--;
}
}
if(j<0){
for(;i>=0;i--){
A[index] = A[i];
index--;
}
}
if(i<0){
for(;j>=0;j--){
A[index] = B[j];
index--;
}
}
return A;
}
- 牛客网算法学习记录-排序2
- 牛客网算法学习记录-排序
- 牛客网算法学习记录-排序3
- 算法学习记录-希尔排序
- 基本排序算法学习记录
- Java 实现快速排序算法-学习记录
- 记录自已学习之排序算法(快速排序)
- 记录自已学习之排序算法(冒泡排序)
- 记录自已学习之排序算法(选择排序)
- 牛客网算法学习记录-链表2
- 牛客网算法学习记录-二叉树2
- 菜鸡学习之归并排序(分治法)------学习算法记录2
- 菜鸡学习之插入排序------学习算法记录1
- 牛客网算法学习记录-字符串
- 牛客网算法学习记录-概率
- 算法记录 : 基本排序
- 算法记录:归并排序
- 算法记录:堆排序
- js中取得变量绝对值的方法
- 滴滴出行(滴滴打车)太耗电太占内存cpu问题之终极解决
- shell变量
- Tomcat
- 手把手教你写框架之ShykyAnnotations - 注解
- 牛客网算法学习记录-排序2
- 2.1 JobScheduler, Job, JobSet 详解
- msp430单片机实现常按键和短按键加去抖功能
- fedora23 安装openssh-server
- 巩固缓存相关,深入解析imageLoader
- JAVA
- Huffman编码文件压缩 - Huffman树的建立与编码
- ant构建出现乱码
- 设计模式之命令模式php示例