继第N次手写写错冒泡排序和选择排序后 决定写一篇博客理清它们…
- 冒泡排序:像一个水底的小气泡从水底冒出,最开始很小,浮向水面的过程中会变得越来越大,到达水面时达到最大,冒泡排序类似于此过程…
- 对一个未被排序的数组进行从小到大排序(假设有未排序数组a[n]),第一轮排序时首先将a[0]和a[1]比较,如果a[0]>a[1],则交换a[0]和a[1]的位置,再将此时的a[1]和a[2]比较,如果a[1]>a[2],则交换a[1]和a[2]的位置,以此类推,第一轮排序结束后,可以将最大的数置于a[n-1]处,第二轮排序时,同样将a[0]和a[1]比较,如果a[0]>a[1],则交换a[0]和a[1]的位置,再将此时的a[1]和a[2]比较,如果a[1]>a[2],则交换a[1]和a[2]的位置… …第二轮最后比较是a[n-3]和a[n-2],第二轮结束后可以将倒数第二大的值置于a[n-2]处… …最后一轮比较的是a[0]和a[1],如果a[0]>a[1],则交换a[0]和a[1]的位置,至此整个数组排序完成…
- 代码实现
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> a(n); //建立数组a[n]
for(int i=0;i<n;i++){
cin>>a[i];
}
/* 冒泡排序方法 */
for(int i=0;i<n-1;i++){ //控制循环次数为n-1次,因为只需要要进行n-1轮比较
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
上述冒泡排序代码还可以写为:::
int count=n-1; //count是数组最大的有效下标
while(count>0){ //控制循环为n-1次
for(int i=0;i<count;i++) {
if (a[i]>a[i+1]) {
int temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
}
}
count--;
}
- 选择排序:第一次遍历数组从a[0]到a[n-1]找到最小的值放在a[0]的位置,第二次遍历数组从a[1]到a[n-1]找到第二小的值放在a[1]的位置,第三次遍历数组从a[2]到a[n-1]找到第三小的值放在a[2]的位置… …以此类推实现数组从小到大排列
- 代码实现
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n;
cin>>n;
vector<int> a(n); //建立数组a[n]
for(int i=0;i<n;i++){
cin>>a[i];
}
/* 选择排序方法 */
int minIndex;
for(int i=0;i<n-1;i++){ //控制循环次数为n-1次
minIndex=i; //minIndex用来保存每一次遍历找到的最小值的下标
for(int j=i+1;j<n;j++){
if(a[j]<a[minIndex]){
minIndex=j;
}
}
int temp=a[i]; //与最小值进行交换 将最小值置于合适位置
a[i]=a[minIndex];
a[minIndex]=temp;
}
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
就是这样啦~