冒泡排序
这又是一个简单的排序方式,只是相比较快排和归并排序而言,耗时更长一些。
举个例子:
下标 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
元素 | 10 | 1 | 5 | 3 | 7 |
思路
如上表所示
我们从最左边的元素开始,从左到右进行元素大小比较,比如,先是10和1进行比较,显然10大于1,那么1和10交换位置,即下标为0的数组框中元素变为1,下标为1的数组框中的元素变为10,接着10和5进行比较;依次规矩,第一次遍历比较后,数组变为如下所示:
下标 | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
元素 | 1 | 5 | 3 | 7 | 10 |
部分代码如下:
if(num[j] > num[j+1]){
int temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
当然一轮比较完后,就进行第二轮比较,但是第一轮比较,已经把最大的那个数比较出来并且交换到数组最右边的那个数组框中,所以第二次比较不需要再比较到最右边的下标那儿,假设数组长度为n,那么第二轮比较到n-2;
for(int j = 0;j < n-i-1;j++){
if(num[j] > num[j+1]){
int temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
}
这就是每一轮比较的核心代码。
完整代码
#include<iostream>
using namespace std;
int main() {
int num[1005];
int n;
cin>>n;
for(int i = 0;i < n;i++)cin>>num[i];
for(int i = 0;i < n-1;i++){
for(int j = 0;j < n-i-1;j++){
if(num[j] > num[j+1]){
int temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
}
}
for(int i = 0;i < n;i++)cout<<num[i]<<" ";
}
样例输入输出
选择排序
代码如下:
#include<iostream>
using namespace std;
int main() {
int num[1005];
int n;
cin>>n;
for(int i = 0;i < n;i++)cin>>num[i];
for(int i = 0;i < n-1;i++){
int min = i;
for(int j = i;j < n;j++){
if(num[min] > num[j]){
min = j;
}
}
if(min != i){
int temp = num[min];
num[min] = num[i];
num[i] = temp;
}
}
for(int i = 0;i < n;i++)cout<<num[i]<<" ";
}
选择排序即先比较,得到最小(或最大的)那个数字的下标,最后在一轮比较完后,交换两个下标所对应的数字。与冒泡排序可以说是大同小异。
希望该文可以对各位初学者有所帮助.