• 各类排序C++实现


    没有加什么模板之类的,全用的int型,下标有的从0开始有的从1开始

    1.插入

     1 #include <iostream>
     2 #include <cstdio>
     3 #define N 1005
     4 using namespace std;
     5 int n, a[N];
     6 void InsertSort(int a[], int n) //下标从0开始
     7 {
     8     int i, j, temp;
     9     for(i = 1; i < n; i++)
    10     {
    11         temp = a[i];
    12         for(j = i; j > 0 && temp < a[j - 1]; j--) a[j] = a[j - 1];
    13         a[j] = temp;
    14     }
    15 }
    16 int main()
    17 {
    18     int i;
    19     scanf("%d", &n);
    20     for(i = 0; i < n; i++) scanf("%d", &a[i]);
    21     InsertSort(a, n);
    22     for(i = 0; i < n; i++) printf("%d\n", a[i]);
    23     return 0;
    24 }

    2.选择

     1 #include <iostream>
     2 using namespace std;
     3 int a[105];
     4 //下标从1开始
     5 void SelectSort(int a[], int n)
     6 {
     7     int i, j, pos;
     8     for(i = 1; i < n; i++)
     9     {
    10         pos = i;
    11         for(j = i; j <= n; j++)
    12         {
    13             if(a[j] < a[pos])
    14             pos = j;
    15         }
    16         int temp = a[pos];
    17         a[pos] = a[i];
    18         a[i] = temp;
    19     }
    20 }
    21 int main()
    22 {
    23     int n, i;
    24     cin >> n;
    25     for(i = 1; i <= n; i++) cin >> a[i];
    26     SelectSort(a, n);
    27     for(i = 1; i <= n; i++)
    28     cout << a[i] << " ";
    29     cout << endl;
    30     return 0;
    31 }

    3.冒泡

     1 #include <iostream>
     2 using namespace std;
     3 int a[105];
     4 //下标从1开始
     5 void BubbleSort(int a[], int n)
     6 {
     7     int i, j;
     8     for(i = 1; i < n; i++)
     9     {
    10         for(j = 1; j <= n - i; j++)
    11         {
    12             if(a[j] > a[j + 1])
    13             {
    14                 int temp = a[j + 1];
    15                 a[j + 1] = a[j];
    16                 a[j] = temp;
    17             }
    18         }
    19     }
    20 }
    21 int main()
    22 {
    23     int n, i;
    24     cin >> n;
    25     for(i = 1; i <= n; i++)
    26         cin >> a[i];
    27     BubbleSort(a, n);
    28     for(i = 1; i <= n; i++)
    29     cout << a[i] << " ";
    30     cout << endl;
    31     return 0;
    32 }

    4.快排

     1 #include <iostream>
     2 using namespace std;
     3 int n;
     4 int a[105];
     5 //下标从0开始
     6 int partition(int a[], int low, int high)
     7 {//快速排序中的一趟
     8     int key;//作为枢轴来使用
     9     key = a[low];
    10     while(low < high)
    11     {
    12         while(low < high && a[high] >= key)
    13         --high;
    14         a[low] = a[high];
    15         while(low < high && a[low] <= key)
    16         ++low;
    17         a[high] = a[low];
    18     }
    19     a[low] = key;
    20     return low;
    21 }
    22 void qsort(int a[], int low, int high)
    23 {//快速排序的递归形式
    24     int loc;
    25     if(low < high)
    26     {
    27         loc = partition(a, low, high);//一趟排序结果的调用
    28         qsort(a, low, loc - 1);
    29         qsort(a, loc + 1, high);
    30     }
    31 }
    32 int main()
    33 {
    34     int i;
    35     cin >> n;
    36     for(i = 0; i < n; i++) cin >> a[i];
    37     qsort(a, 0, n - 1);
    38     for(i = 0; i < n; i++) cout << a[i] << " ";
    39     cout << endl;
    40     return 0;
    41 }

    5.归并

     1 #include <iostream>
     2 #define N 105
     3 using namespace std;
     4 int n;
     5 int a[N], t[N];
     6 /* 归并 */
     7 //下标从0开始
     8 void Merge(int a[], int l, int m, int r)
     9 {
    10     /* p指向输出区间 */
    11     int p = 0;
    12     /* i、j指向2个输入区间 */
    13     int i = l, j = m + 1;
    14     /* 2个输入区间都不为空时 */
    15     while(i <= m && j <= r)
    16     {/* 取关键字小的记录转移至输出区间 */
    17         if (a[i] > a[j])
    18             t[p++] = a[j++];
    19         else
    20             t[p++] = a[i++];
    21     }
    22     /* 将非空的输入区间转移至输出区间 */
    23     while(i <= m) t[p++] = a[i++];
    24     while(j <= r) t[p++] = a[j++];
    25     /* 归并完成后将结果复制到原输入数组 */
    26     for (i = 0; i < p; i++)
    27         a[l + i] = t[i];
    28 }
    29 
    30 /* 归并排序 */
    31 void MergeSort(int a[], int l, int r)
    32 {
    33     int m;
    34     if (l < r)
    35     {/* 将长度为n的输入序列分成两个长度为n/2的子序列 */
    36         m = (l + r) / 2;
    37         /* 对两个子序列分别进行归并排序 */
    38         MergeSort(a, l, m);
    39         MergeSort(a, m + 1, r);
    40         /* 将2个排好的子序列合并成最终有序序列 */
    41         Merge(a, l, m, r);
    42     }
    43 }
    44 int main()
    45 {
    46     int i;
    47     cin >> n;
    48     for(i = 0; i < n; i++) cin >> a[i];
    49     MergeSort(a, 0, n - 1);
    50     for(i = 0; i < n; i++) cout << a[i] << " ";
    51     cout << endl;
    52     return 0;
    53 }

    6.堆排

     1 #include <iostream>
     2 using namespace std;
     3 int n;
     4 int a[105];
     5 //下标从1开始
     6 void HeapAdjust(int A[], int a, int z) 
     7 {
     8     int i, j;
     9     for(i = a, j = 2 * i; j <= z; i = j, j = 2 * i)
    10     { //i为父,j为子
    11         if(j < z && A[j + 1] > A[j]) j++;   //大顶堆,沿大孩子方向下行
    12         if(A[i] < A[j])
    13             swap(A[i], A[j]);
    14         else break;
    15     }
    16 }
    17 void HeapSort(int A[], int n)
    18 {
    19     int i;
    20     for(i = n / 2; i >= 1; i--) //从倒数第一个非叶子结点,自下而上堆化
    21         HeapAdjust(A, i, n);
    22     for(i = n; i > 1; i--)
    23     { //交换A[1]与最后元素A[i](i=n, ..., 1), 再堆化
    24         swap(A[1], A[i]);
    25         HeapAdjust(A, 1, i - 1);
    26     }
    27 }
    28 int main()
    29 {
    30     int i;
    31     cin >> n;
    32     for(i = 1; i <= n; i++)
    33     cin >> a[i];
    34     HeapSort(a, n);
    35     for(i = 1; i <= n; i++) cout << a[i] << " ";
    36     cout << endl;
    37     return 0;
    38 }
  • 相关阅读:
    变分法浅析
    再生核希尔伯特空间(RKHS)在监督学习(SVM)中的应用
    关于对偶最优化
    两个公式
    Linux系统——账号管理
    Linux系统——源码编译安装
    Linux系统——最小化安装
    Linux系统——本地yum仓库安装
    Linux系统——rpm命令
    Linux系统——vim编辑器
  • 原文地址:https://www.cnblogs.com/10jschen/p/2646101.html
Copyright © 2020-2023  润新知