文章目录
- 其他排序算法
- 冒泡排序
- 算法实现
- 代码实例
- 插入排序
- 算法实现
- 代码实例
- 选择排序
- 算法实现
- 代码实例
其他排序算法
一学就废的归并排序
冒泡排序
排列顺序从前到后或者从后往前都可,本文选择从后到前的顺序,
升序排列:比较相邻两个元素,大的放后面,小的放前面,
(降序排列反之)第一个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;
}