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; }
相关文章推荐
- 【c++语言基础】在c++中的排序(冒泡排序和选择排序)
- 蓝桥杯基础练习之十六进制转十进制、十六进制转八进制、数列排序、时间转换、字符串对比(c/c++/java)
- c++实现冒泡排序——以蓝桥杯【基础练习】【数列排序】为例
- C++15道基础算法题---(1)合并已排序数组
- C++基础算法练习之排序比较
- C++——算法基础之排序——快速排序
- 算法与数据结构基础 -- 排序 (C++实现)
- C++——算法基础之排序——选择排序
- C++——算法基础之排序——希尔排序(已修改)
- 【算法导论】C++参考源码之基础排序
- C++语法基础--泛型算法(generic algorithm)--对容器排序的算法sort(),stable_sort(),unique()
- C++基础笔记之四:插入排序
- 排序基础算法总结与c++实现
- C++实现各种基础排序(冒泡、选择、快排、插入、堆排、希尔、归并)
- 基础排序:单元,冒泡,分治排序的C++实现与讨论
- c++中的三种排序,比较基础,因为作为一个编程员总要会几种排序方法
- 基础的排序C++实现
- C++基础笔记之五:快速排序
- C++语言基础 例程 运算符重载的方法
- 基础:排序算法(三)选择排序