冒泡排序
排列顺序从前到后或者从后往前都可,本文选择从后到前的顺序,
升序排列:比较相邻两个元素,大的放后面,小的放前面,
(降序排列反之)第一个for决定排列数组下标为i的元素,第二个for执行i遍比较过程。
点击这里可以看到动画版的冒泡排序【一个很有趣的网站】
算法实现
void sort(int* a,int len){
//冒泡排序,a为数组首地址,len为数组长度
int temp;
for(size_t i = len; 0 < i; i--){
//确定数组下标为i的元素
for(size_t j = 0; j < i; j++){
//执行i遍比较过程
if(a[j+1] < a[j]){
temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
}
代码实例
#include <iostream>
using namespace std;
void sort(int* a,int len){
int temp;
for(size_t i = len; 0 < i; i--){
//冒泡排序
for(size_t j = 0; j < i; j++){
if(a[j+1] < a[j]){
temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
}
int main(int argc, char const *argv[]) {
int n;
while (cin>>n,n) {
int a[n];
for(int i=0;i < n; i++){
cin >> a[i];
}
int len = sizeof(a)/sizeof(a[0]);
sort(a,len);
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
}
}
插入排序
排列顺序从前到后或者从后往前都可,本文选择从前到后的顺序,
每次要确定的数组元素的值要先存入一个临时变量中(例如下面的temp
),再将它之前的元素与它比较,比它大的都往后移动一位(降序排列操作反之
),例如:a[7]={1,3,5,2,4,8,7}中,假设此时已经过3轮排序,该执行第4轮排序时,将2赋值给temp,之后将3,5向后移,然后将temp的值赋给a[2],这样就相当于做了一个将2插入1,3之间的操作。每个元素都做这样一个操作之后,整个数组便完成排序了。
ps:上文的网站也可以看插入排序
算法实现
void sort(int* a,int len) {
//插入排序,升序排列
int temp,i,j;
for(i = 1; i < len; i++){
//决定第i个元素
temp = a[i];//先将要插入的值赋给临时变量防止以数据丢失
for(j = i; 0 < j; j--){
//执行i遍比较
if(temp < a[j-1]){
//a[i]之前的元素比temp大的往后移一位
a[j] = a[j-1];
}
else{
break;//找到了该插入的位置,退出本层循环,决定下一个元素的位置
}
}
a[j] = temp;//将元素插入到其该存在的位置
}
}
代码实例
#include<iostream>
using namespace std;
void sort(int* a,int len) {
//插入排序,升序排列
int temp,i,j;
for(i = 1; i < len; i++){
//决定第i个元素
temp = a[i];
for(j = i; 0 < j; j--){
//执行i-1遍比较
if(temp < a[j-1]){
a[j] = a[j-1];
}
else{
break;
}
}
a[j] = temp;
}
}
int main(int argc, char const *argv[]) {
int n;
while (cin>>n,n) {
int a[n];
for(int i=0;i < n; i++){
cin >> a[i];
}
int len = sizeof(a)/sizeof(a[0]);
sort(a,len);
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
}
return 0;
}
选择排序
排列顺序从前到后或者从后往前都可,本文选择从前到后的顺序,
每次要确定的数组元素的值要先存入一个临时变量中(例如下面的min
),再将它之后的元素与它比较,如果某位置的元素比该位置元素值小(降序排列操作反之
),则交换两个位置的元素,并更新min的值,例如:a[7]={1,4,5,3,2,8,7}中,假设此时已经过1轮排序,该执行第2轮排序时,将4赋值给min,之后判定到a[3]时,发现min的值大于a[3](4>3),交换a[1]和a[3]的元素,也就是数组变成了a[7]={1,3,5,4,2,8,7},并更新min的值(min = 3),接下来继续往后比较时发现min的值大于a[4] (3>2),则重复之前的操作,交换a[1]与a[4]的内容,也就是数组变成了a[7]={1,2,5,4,3,8,7},并更新min的值(min = 2),之后再无数组元素值小于min,遍历完成,一轮排序结束。每个位置(除了最后一个位置,其他位置排好了之后,最后一个位置的元素自然而然就排好了)都做这样一个操作之后,整个数组便完成排序了。
ps:上文的网站也可以看选择排序
算法实现
void sort(int* a,int len) {
//选择排序,升序排列
int min,i,j;
for(i = 0; i < len-1; i++){
//确定数组下标为i的元素
min = a[i];//min作为临时变量存储当前最小的值
for(j = i+1; j < len; j++){
//执行n-i-1遍比较
if(min > a[j]){
//如果j位置的元素比i位置元素值小,则交换两个位置的元素,并更新min的值
a[i] = a[j];
a[j] = min;
min = a[i];
}
}
}
}
代码实例
#include<iostream>
using namespace std;
void sort(int* a,int len) {
//选择排序,升序排列
int min,i,j;
for(i = 0; i < len-1; i++){
//确定数组下标为i的元素
min = a[i];//min作为临时变量存储当前最小的值
for(j = i+1; j < len; j++){
//执行n-i-1遍比较
if(min > a[j]){
a[i] = a[j];
a[j] = min;
min = a[i];
}
}
}
}
int main(int argc, char const *argv[]) {
int n;
while (cin>>n,n) {
int a[n];
for(int i=0;i < n; i++){
cin >> a[i];
}
int len = sizeof(a)/sizeof(a[0]);
sort(a,len);
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
}
return 0;
}