您的位置:首页 > 编程语言 > C语言/C++

C/C++基础排序

2019-07-31 08:14 106 查看

C/C++ 基础排序算法

插入排序法

#include<stdio.h>

/*
插入排序法
一、将开头元素视为已排序
二、执行下述处理,直至排序部分消失
1. 取出未排序部分的开头元素赋给变量v;
2. 在已排序部分,将所有比v大的元素向后移动一个单位;
3. 将已取出的元素v插入空位;
*/

/* 按顺序输出数组元素 */
void trace (int A[], int N) {
int i;
for (i = 0; i < N; i++){
if (i > 0) printf(" ");
printf("%d", A[i]);
}
printf("\n");
}

/* 插入排序( 0起点数组)*/
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;

/*
一、重复执行下述处理,直到数组中不包含顺序相反的相邻元素
1. 从数组末尾开始一次比较相邻两个元素,如果大小关系相反则交换位置
*/

// 使用flag的冒泡排序法
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>

/*
一、重复执行N-1此下述处理
1. 找出未排序部分最小值的位置minj;
2. 将minj位置的元素与未排序部分的起始元素交换;
*/

/* 选择排序法(0起点) */
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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: