插入排序法
#include<stdio.h>
void trace (int A[], int N) {
int i;
for (i = 0; i < N; i++){
if (i > 0) printf(" ");
printf("%d", A[i]);
}
printf("\n");
}
void insertionSort(int A[], int N){
int j, i, v;
for (i = 1; i < N; i++){
v = A[i];
j = i - 1;
while ( j >= 0 && A[j] > v){
A[j + 1] = A[j];
j--;
}
A[j + 1] = v;
trace(A, N);
}
}
int main(){
int N, i, j;
int A[100];
scanf("%d", &N);
for (i = 0; i < N; i++) scanf("%d", &A[i]);
trace(A, N);
insertionSort(A, N);
return 0;
}
冒泡排序法
#include<iostream>
using namespace std;
int bubbleSort(int A[], int N){
int sw = 0;
bool flag = 1;
for (int i = 0; flag; i++){
flag = 0;
for (int j = N - 1; j >= i + 1; j--){
if (A[j] < A[j - 1]){
swap(A[j], A[j - 1]) ;
flag = 1;
sw++;
}
}
}
return sw;
}
int main(){
int A[100], N, sw;
cin >> N;
for (int i = 0; i < N; i++) cin >> A[i];
sw = bubbleSort(A, N);
for (int i = 0; i < N; i++){
if (i) cout << " ";
cout << A[i];
}
cout << endl;
cout << sw << endl;
return 0;
}
选择排序法
#include<stdio.h>
int selectionSort(int A[], int N){
int i, j, t, sw = 0, minj;
for (i = 0; i < N - 1; i++){
minj = i;
for (j = i; j < N; j++){
if (A[j] < A[minj]) minj = j;
}
t = A[i]; A[i] = A[minj]; A[minj] = t;
if (i != minj) sw++;
}
return sw;
}
int main(){
int A[100], N, i, sw;
scanf("%d", &N);
for (i = 0; i < N; i++) scanf("%d", &A[i]);
sw = selectionSort(A, N);
for (i = 0; i < N; i++){
if (i) printf(" ");
printf("%d", A[i]);
}
printf("\n");
printf("%d\n", sw);
return 0;
}
希尔排序
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
long long cnt;
int l;
int A[1000000];
int n;
vector<int> G;
void insertionSort(int A[], int n, int g){
for (int i = g; i < n; i++){
int v = A[i];
int j = i - g;
while (j >= 0 && A[j] > v){
A[j + g] = A[j];
j -= g;
cnt++;
}
A[j + g] = v;
}
}
void shellSort(int A[], int n){
for (int h = 1; ;){
if (h > n) break;
G.push_back(h);
h = 3*h + 1;
}
for (int i = G.size()-1; i >= 0; i--){
insertionSort(A, n, G[i]);
}
}
int main(){
cin >> n;
for (int i = 0; i < n; i++) scanf("%d", &A[i]);
cnt = 0;
shellSort(A, n);
cout << G.size() << endl;
for (int i = G.size() - 1; i >= 0; i--){
printf("%d", G[i]);
if (i) printf(" ");
}
printf("\n");
printf("%d\n", cnt);
for (int i = 0; i < n; i++) printf("%d\n", A[i]);
return 0;
}