插入排序:
#include<iostream>
#include<string.h>
using namespace std;
void output(int a[], int n){
for(int i = 0; i < n; i++) {
cout<<a[i]<<" ";
}
cout<<endl;
}
int main(){
int a[105];
memset(a,0,sizeof(a));
int n;
cin>>n;
for(int i = 0; i < n; i++) {
cin>>a[i];
}
for(int i = 0; i < n; i++) {
int temp = a[i];
int j = i - 1;
while(j >= 0 && a[j] > temp){
a[j+1] = a[j];
j--;
}
a[j+1] = temp;
output(a, n);
}
return 0;
}
插入排序,幻想成是你在抓扑克牌的时候。以i为分割线,i之前的扑克牌都是已经拍好顺序的了。
所以你需要在i进行插入的时候,和它前面的一个个比较,若前面的要大于它,就覆盖,直到找到一个小于它的数j,就放在这个数的后面。
插入排序可以高速整理顺序很整齐的数据。
冒泡排序
#include<iostream>
#include<string.h>
using namespace std;
void output(int a[], int n){
for(int i = 0; i < n; i++) {
cout<<a[i]<<" ";
}
cout<<endl;
}
int main(){
int a[105];
memset(a,0,sizeof(a));
int n;
int times=0;
cin>>n;
for(int i = 0; i < n; i++) {
cin>>a[i];
}
for(int i = 0; i < n; i++) {
for(int j = n-1; j >= i + 1; j--) {
if(a[j-1] > a[j]) {
int temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
times++;
}
}
}
output(a, n);
cout<<times;
return 0;
}
从高处开始,往底层两个两个的判断。就好像泡泡一样把小的往前面送了。一趟完成后,之前未排序部分的第一个肯定是剩下数里最小的。
选择排序
#include<iostream>
#include<string.h>
using namespace std;
void output(int a[], int n){
for(int i = 0; i < n; i++) {
cout<<a[i]<<" ";
}
cout<<endl;
}
int main(){
int a[105];
memset(a,0,sizeof(a));
int n;
int times=0;
cin>>n;
for(int i = 0; i < n; i++) {
cin>>a[i];
}
for(int i = 0; i < n; i++) {
int index = i;
for(int j = i + 1; j < n; j++) {
if(a[index] > a[j]){
index = j;
}
}
if(index != i){
int temp = a[index];
a[index] = a[i];
a[i] = temp;
times++;
}
}
output(a, n);
cout<<times;
return 0;
}
就是一趟趟地走,每次选择那个最小/大的。
选择排序不一定是一种稳定的算法。如果最小的那个数字和重复大数字交换排序后,就会出现位置变换了。
希尔排序
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void output(int a[], int n){
for(int i = 0; i < n; i++) {
cout<<a[i]<<endl;
}
}
void insertion(int a[], int n, int g, int ×) {
for(int i = 0; i < n; i++) {
int temp = a[i];
int j = i-g;
while(j >= 0 && a[j] > temp) {
a[j+g] = a[j];
j = j - g;
times++;
}
a[j+g] = temp;
}
}
int main(){
int a[105];
memset(a,0,sizeof(a));
int n;
int times=0;
cin>>n;
for(int i = 0; i < n; i++) {
cin>>a[i];
}
vector<int> gs;
for(int h=1;;){
if(h>n) break;
gs.push_back(h);
h = 3*h + 1;
}
for(int i = gs.size()-1; i >= 0; i--) {
insertion(a, n, gs[i], times);
}
cout<<gs.size()<<endl;
for(int i = gs.size()-1; i >= 0; i--) {
cout<< gs[i]<<" ";
}
cout<<endl;
cout<<times<<endl;
output(a, n);
return 0;
}
希尔排序是加工过后的插入排序。
是按间隔来分别进行插入排序。这个间隔的算法是按照那个复杂度来的吧,这个题的要求是O(N1.25),所以题目用了gn+1=3gn+1;