备战复试,每日三题
题目一:冒泡排序
冒泡排序的思想:(这里我们按照从小到大排序,讲解)
- 从头开始比较相邻两个数,若逆序(即前一个数比后一个数要大),则交换这两个数
- 第一轮冒泡排序下来:待排序数中的最大的数到达最后一个位置,最后一个位置固定,再对前n-1个数进行冒泡排序
- 第二轮冒泡排序下来:待排序数中的最大的数到达倒数第二个位置,倒数第二个位置固定,再对前n-2个数进行冒泡排序
- …
- 剩下最后一个数不用排序,在第一个位置,为最小的数
void BubbleSort(vector<int>& nums){
int n=nums.size();
bool flag=false;
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(nums[j+1]<nums[j}){
flag=true;
int temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
if(!flag){
break;
}else{
flag=false;
}
}
}
题目二:选择排序
选择排序的思想:(这里我们按照从小到大排序,讲解)
-
从待排序数中找出最小的数,放在第一个位置,第一个位置固定
-
再从剩余的待排序数中找出最小的数,放在第二个位置,第二个位置固定
-
…
-
最后一个数字不用再排,放在最后一个位置
void selectSort(vector<int>& nums){
int min=0,index=0;
int n=nums.size();
for(int i=0;i<n-1;i++){
min=nums[i];
index=i;
for(int j=i+1;j<n;j++){
if(nums[j]<min){
min=nums[j];
index=j;
}
}
nums[index]=nums[i];
nums[i]=min;
}
}
题目三: 归并排序
归并排序(Merge Sort)是利用归并的思想实现的排序方法,该算法采用经典的分治策略将问题分成一些小的问题然后递归求解,即分而治之。
//先划分
void MergeSort(vector<int>& nums,int start,int end,vector<int>& temp){
if(start<end){
int mid=(start+end)/2;
MergeSort(nums,start,mid,temp);
MergeSort(nums,mid,end,temp);
merge(nums,start,mid,end,temp);
}
}
//再合并
void merge(vector<int>& a,int start,int mid,int end,vector<int>& temp ){
int i=left;
int j=mid+1;
int t=0;//指向辅助数组的元素
while(i<=mid&&j<=right) {//两侧都有元素
//将较小的元素放入辅助数组
if(a[i]<=a[j]) {
temp[t++]=a[i++];
}else {
temp[t++]=a[j++];
}
}
//左侧还有元素时,将其依次放入辅助数组
while(i<=mid) {
temp[t++]=a[i++];
}
//右侧还有元素时,将其依次放入辅助数组
while(j<=right) {
temp[t++]=a[j++];
}
//将辅助数组中的元素复制到原属组中
t=0;
int templeft=left;
while(templeft<=right){
a[templeft]=temp[t];
t++;
templeft++;
}
}