我们在面试中回文一些基础知识,比如查找与排序,这是一个热门问题,如何能快速准确写出来,成为能否面试成功的关键。
快排:
思想:就是找一个基准,看看这个每次将比这个数大的放在左边,大的放在右边
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<vector>
using namespace std;
//产生随机数的函数
int RandomRange(int low, int high){
int numRand=0;
numRand = rand() %(high-low+1) + low;
return numRand;
}
//找到数组的分离点;或者说是分成两段的的分割点;
int Partition(vector<int>&data,int length,int start,int end){
if(length<=0||start<0||end>=length){
return -1;
}
//在start,end之间随机找一个数,作为分离点
int index = RandomRange(start,end);
//将这个分割点放到最后;
swap(data[index],data[end]);
int small = start-1;
for(int index=start;index<end;index++){
if(data[index]<data[end]){
small++;
if(index!=small){
swap(data[index],data[small]);
}
}
}
small++;
swap(data[small],data[end]);
return small;
}
//递归实现快排;
void QuickSort(vector<int>&data,int length,int start,int end){
int index = Partition(data, length,start,end);
if(index>start){
QuickSort(data,length,start,index-1);
}
if(index<end){
QuickSort(data,length,index+1,end);
}
return;
}
int main(){
vector<int>data = {3,8,4,5,2};
int length = data.size();
QuickSort(data,length,0,length-1);
for(auto num:data){
cout<<num<<' ';
}
cout<<endl;
return 0;
}
二分查找:
思想:不断对数组分块,对每一块查找。
#include<iostream>
#include<vector>
#include<stdlib.h>
using namespace std;
//对于有序的数组进行旋转之后,编变成旋转数组后,进行二分查找,会很方便;
int findMin(vector<int>&nums, int length){
int index1=0,index2 = length-1;
int Midindex = index1;
while(nums[index1]>=nums[index2]){
if(index2-index1==1){
Midindex=index2;
break;
}
Midindex = (index1+index2)/2;
if(nums[Midindex]>nums[index1]){
index1 = Midindex;
}
if(nums[Midindex]<nums[index2]){
index2 = Midindex;
}
}
return nums[Midindex];
}
int main(){
vector<int>nums={3,4,5,1,2};
int length = nums.size();
int res = findMin(nums, length);
cout<<res<<endl;
return 0;
}
归并排序
思想就是:
归并排序利用了递归的思想(而是分而治之的思想),将数组一分为二,先将左半部分(坐标为0~mid)排好序,再将右半部分排好序(都是调用函数),最后将两部分合并起来。整体算法时间复杂度为O(nlogn),空间复杂度为O(n)。
其实就是将先将数组分成一份一份的,一份一个数,然后,将这个有序的数组进行排好序,是从插入排序上进阶的。
#include<iostream>
#include<vector>
#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
using namespace std;
//将小数组的按顺序进行合并;
void Merge(vector<int>&nums,int l1,int r1,int l2,int r2){
int i=l1,j=l2;
int n = (r1-l1+1)+(r2-l2+1);
vector<int>tmp(n);
int k=0;
while(i<=r1&&j<=r2){
if(nums[i]<nums[j]){
tmp[k++] = nums[i++];
}else{
tmp[k++] = nums[j++];
}
}
while(i<=r1){
tmp[k++] = nums[i++];
}
while(j<=r2){
tmp[k++] = nums[j++];
}
//排序完更新数组
for(int t=0;t<n;t++){
nums[l1+t] = tmp[t];
}
}
//将数组分成一个一份
void MergeSort(vector<int>&nums,int start,int end){
if(start<end){
int mid = (start+end)>>1;
MergeSort(nums,start,mid);
MergeSort(nums,mid+1,end);
Merge(nums,start,mid,mid+1,end);
}
}
int main(){
vector<int>nums={ 1,4,3,2,5,6,3};
int start = 0, end = nums.size()-1;
MergeSort(nums,start,end);
for(auto num:nums){
cout<<num<<" ";
}
cout<<endl;
return 0;
}