选择排序
- 基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排序的数据元素排完。
- 排序过程:
初始关键字后 [49 38 65 97 76 13 27 49]
第一趟排序后 13 [38 65 97 76 49 27 49]
第二趟排序后 13 27 [65 97 76 49 38 49]
第三趟排序后 13 27 38 [97 76 49 65 49]
第四趟排序后 13 27 38 49 [76 97 65 49]
第五趟排序后 13 27 38 49 49 [97 65 76]
第六趟排序后 13 27 38 49 49 65 [97 76]
第七趟排序后 13 27 38 49 49 65 76 [97]
最后排序结果 13 27 38 49 49 65 76 97
例题:
#include <iostream>
using namespace std;
int main(){
int i,j,temp,k;
int a[8]={49,38,65,97,76,13,27,49};
for(i = 0 ; i <= 7; i++){
k = i;
for(j = i+1; j <= 7; j++){
if(a[j] < a[k]) k = j;
}
if(k != i){
temp = a[i];
a[i] = a[k];
a[k] = temp;
}
}
for(i = 0 ; i <= 7; i++){
cout << a[i] << " ";
}
cout << endl;
}
冒泡排序
思想:以n个人战队为列,从第1个开始,依次比较相邻的两个是否逆序对(逆序对:高在前,矮在后),若逆序就交换这两个人,即第1个和第2个比,若逆序就交换两个人,接着第2个和第3个人比,若逆序就交换两人,接着第3个和第4个人比,若逆序就交换两人,……,直到n-1和n比较。
经过一轮比较后,则把最高的人排到最后,即将最高的人想冒泡一样逐步冒到相应的位置。原n个人的排序问题,就转换成n-1个人的排序问题。
第二轮从第1个人开始,依次比较相邻的两个人是否逆序对,若逆序就交换两人,直到n-2和n-1比较。如此进行n-1轮后,队列为为有序的队列。
比如 排序 6 5 3 4 1 2
第一趟排序:~~5 6~~ 3 4 1 2 5 ~~3 6~~ 4 1 2 5 3 ~~4 6~~ 1 2 5 3 4 ~~1 6~~ 2 5 3 4 1 ~~2 ***6***~~ 最后一趟结束后,6就固定下来了
第二趟排序:
5 3 4 1 2 6 ~~3 5~~ 4 1 2 6 3 ~~4 5~~ 1 2 6 3 4 ~~1 5~~ 2 6 3 4 1 ~~2 ***5***~~ ***6*** 最后一趟结束后,5就固定下来了
第三趟排序:
3 4 1 2 5 6 ~~3 4~~ 1 2 5 6 3 ~~1 4~~ 2 5 6 3 1 ~~2 ***4***~~ ***5 6*** 最后一趟结束后,4就固定下来了
第四趟排序:
3 1 2 4 5 6 ~~1 3~~ 2 4 5 6 1 ~~2 ***3***~~ ***4 5 6*** 最后一趟结束后,3就固定下来了
第五趟排序:
~~1 ***2***~~ ***3 4 5 6*** 最后一趟结束后,2就固定下来了
代码如下:
#include <iostream>
using namespace std;
int main(){
int a[6] = {6,5,3,4,1,2};
int i,j;
bool ok;
for(i = 5; i >= 0; i--){
ok = true;
for(j = 0; j < i; j++){
if(a[j] > a[j+1]){
swap(a[j],a[j+1]);
ok = false;
}
}
if(ok) break;//如果是一个有序的串,比如 1 2 3 4 5 6,那么就不需要排序
}
for(i = 0 ;i <= 5 ; i++){
cout << a[i] << " ";
}
cout << endl;
return 0;
}