• 排序算法


    1.直接插入排序

     1 #include <iostream>
     2 #include <iomanip>
     3 //直接插入
     4 using namespace std;
     5 void swap(int &x, int &y)
     6 {
     7     int temp = x;
     8     x = y;
     9     y = temp;
    10 }
    11 void insertion(int a[], int sz)
    12 {
    13     for (int i = 1; i < sz; i++) {
    14         int j = i;
    15         while (j > 0 && (a[j] < a[j - 1])) {
    16             swap(a[j], a[j - 1]);
    17             j--;
    18         }        
    19     }
    20     for (int k = 0; k < sz; k++)
    21         cout << setw(3) << a[k];
    22 }
    23 
    24 void main()
    25 {
    26     int a[] = { 15, 9, 8, 1, 4, 11, 7, 12, 13, 6, 5, 3, 16, 2, 10, 14 };
    27     int size = sizeof(a) / sizeof(int);
    28     for (int i = 0; i < size; i++) 
    29         cout << setw(3) << a[i];
    30     cout << endl;
    31     insertion(a, size);
    32     
    33 }

    2.折半插入排序

     1 #include <iostream>
     2 #include <iomanip>
     3 using namespace std;
     4 
     5 void HalfInsertSort(int a[] , int size){
     6     int i, j, low, high, mid;
     7     for (i = 2; i <size;i++){
     8         a[0] = a[i];
     9         low = 1;
    10         high = i - 1;
    11         while (low <= high){
    12             mid = (low + high) / 2;
    13             if (a[mid] > a[0])
    14                 high = mid - 1;
    15             else
    16                 low = mid + 1;
    17         }
    18         for (j = i - 1; j >= high + 1;--j){
    19             a[j + 1] = a[j];
    20         }
    21         a[high + 1] = a[0];
    22     }
    23     cout << endl;
    24 }
    25 void main() {
    26     int a[]  = { 0, 5, 2, 4, 3, 1 };
    27     int size = sizeof(a) / sizeof(int);
    28     for (int i = 0; i < size; i++){
    29         cout << setw(3) << a[i];
    30     }
    31     cout << endl;
    32     HalfInsertSort(a, size);
    33     for (int i = 0; i < size; i++){
    34         cout << setw(3) << a[i];
    35     }
    36 }

    3.希尔排序

     1 #include "iostream"
     2 #include "iomanip"
     3 using namespace std;
     4 void ShellInsertSort(int a[], int n)
     5 {
     6     int i, j, gap;
     7 
     8     for (gap = n / 2; gap > 0; gap /= 2) //步长  
     9     for (i = 0; i < gap; i++)        //直接插入排序  
    10     {
    11         for (j = i + gap; j < n; j += gap)
    12         if (a[j] < a[j - gap])
    13         {
    14             int temp = a[j];
    15             int k = j - gap;
    16             while (k >= 0 && a[k] > temp)
    17             {
    18                 a[k + gap] = a[k];
    19                 k -= gap;
    20             }
    21             a[k + gap] = temp;
    22         }
    23     }
    24 }
    25 void main(){
    26     int a[] = { 0, 5, 2, 4, 3, 1, 7, 9 };
    27     int size = sizeof(a) / sizeof(int);
    28     for (int i = 0; i < size; i++){
    29         cout << setw(3) << a[i];
    30     }
    31     cout << endl;
    32     ShellInsertSort(a, size);
    33     for (int i = 0; i < size; i++){
    34         cout << setw(3) << a[i];
    35     }
    36 }

    4.冒泡排序

     1 #include <stdio.h>  
     2 void swap(int &a, int &b)
     3 {
     4     int temp = a;
     5     a = b;
     6     b = temp;
     7 }
     8 void main()
     9 {
    10     int arr[] = { 15, 225, 34, 42 };
    11     int size = sizeof(arr)/sizeof(int);
    12     int i, j;
    13     for (i = 0; i < size; ++i)
    14     {
    15         for (j = 0; j < size - i-1;j++){
    16             if (arr[j]>arr[j + 1])
    17                 swap(arr[j], arr[j + 1]);
    18         }
    19     }
    20     for (i = 0; i <size; ++i)
    21     {
    22         printf("%4d", arr[i]);
    23     }
    24 }

    5.快速排序

     1 #include <stdio.h>  
     2 //快速排序  
     3 void quick_sort(int s[], int l, int r)
     4 {
     5     if (l < r)
     6     {
     7         int i = l, j = r, x = s[l];
     8         while (i < j)
     9         {
    10             while (i < j && s[j] >= x)  
    11                 j--;
    12             if (i < j)
    13                 s[i++] = s[j];
    14 
    15             while (i < j && s[i] < x) 
    16                 i++;
    17             if (i < j)
    18                 s[j--] = s[i];
    19         }
    20         s[i] = x;
    21         quick_sort(s, l, i - 1); 
    22         quick_sort(s, i + 1, r);
    23     }
    24 }
    25 void main()
    26 {
    27     int arr[] = { 15, 225, 34, 42 ,8};
    28     int size = sizeof(arr)/sizeof(int);
    29     quick_sort(arr, 0, size - 1);
    30     for (int i = 0; i < size; i++){
    31         printf("%6d",arr[i]);
    32     }
    33 }

     6.选择排序

     1 #include <stdio.h>  
     2 //选择排序  
     3 void SelectSort(int arr[],int size){
     4     for (int i = 0; i < size; i++){
     5         for (int j = i + 1; j < size;j++){
     6             if (arr[i] > arr[j]){
     7                 int temp = arr[i];
     8                 arr[i] = arr[j];
     9                 arr[j] = temp;
    10             }
    11         }
    12     }
    13 }
    14 
    15 void main()
    16 {
    17     int arr[] = { 15, 225, 34, 42 ,8};
    18     int size = sizeof(arr)/sizeof(int);
    19     int l = 0;
    20     SelectSort(arr,size);
    21     for (int i = 0; i < size; i++){
    22         printf("%6d",arr[i]);
    23     }
    24 }

    7.归并排序

      1 /**
      2 * 归并排序:C 语言
      3 *
      4 * @author skywang
      5 * @date 2014/03/12
      6 */
      7 
      8 #include <stdio.h>
      9 #include <stdlib.h>
     10 
     11 // 数组长度
     12 #define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) )
     13 
     14 /*
     15 * 将一个数组中的两个相邻有序区间合并成一个
     16 *
     17 * 参数说明:
     18 *     a -- 包含两个有序区间的数组
     19 *     start -- 第1个有序区间的起始地址。
     20 *     mid   -- 第1个有序区间的结束地址。也是第2个有序区间的起始地址。
     21 *     end   -- 第2个有序区间的结束地址。
     22 */
     23 void merge(int a[], int start, int mid, int end)
     24 {
     25     int *tmp = (int *)malloc((end - start + 1)*sizeof(int));    // tmp是汇总2个有序区的临时区域
     26     int i = start;            // 第1个有序区的索引
     27     int j = mid + 1;        // 第2个有序区的索引
     28     int k = 0;                // 临时区域的索引
     29 
     30     while (i <= mid && j <= end)
     31     {
     32         if (a[i] <= a[j])
     33             tmp[k++] = a[i++];
     34         else
     35             tmp[k++] = a[j++];
     36     }
     37 
     38     while (i <= mid)
     39         tmp[k++] = a[i++];
     40 
     41     while (j <= end)
     42         tmp[k++] = a[j++];
     43 
     44     // 将排序后的元素,全部都整合到数组a中。
     45     for (i = 0; i < k; i++)
     46         a[start + i] = tmp[i];
     47 
     48     free(tmp);
     49 }
     50 
     51 /*
     52 * 归并排序(从上往下)
     53 *
     54 * 参数说明:
     55 *     a -- 待排序的数组
     56 *     start -- 数组的起始地址
     57 *     endi -- 数组的结束地址
     58 */
     59 void merge_sort_up2down(int a[], int start, int end)
     60 {
     61     if (a == NULL || start >= end)
     62         return;
     63 
     64     int mid = (end + start) / 2;
     65     merge_sort_up2down(a, start, mid); // 递归排序a[start...mid]
     66     merge_sort_up2down(a, mid + 1, end); // 递归排序a[mid+1...end]
     67 
     68     // a[start...mid] 和 a[mid...end]是两个有序空间,
     69     // 将它们排序成一个有序空间a[start...end]
     70     merge(a, start, mid, end);
     71 }
     72 
     73 
     74 /*
     75 * 对数组a做若干次合并:数组a的总长度为len,将它分为若干个长度为gap的子数组;
     76 *             将"每2个相邻的子数组" 进行合并排序。
     77 *
     78 * 参数说明:
     79 *     a -- 待排序的数组
     80 *     len -- 数组的长度
     81 *     gap -- 子数组的长度
     82 */
     83 void merge_groups(int a[], int len, int gap)
     84 {
     85     int i;
     86     int twolen = 2 * gap;    // 两个相邻的子数组的长度
     87 
     88     // 将"每2个相邻的子数组" 进行合并排序。
     89     for (i = 0; i + 2 * gap - 1 < len; i += (2 * gap))
     90     {
     91         merge(a, i, i + gap - 1, i + 2 * gap - 1);
     92     }
     93 
     94     // 若 i+gap-1 < len-1,则剩余一个子数组没有配对。
     95     // 将该子数组合并到已排序的数组中。
     96     if (i + gap - 1 < len - 1)
     97     {
     98         merge(a, i, i + gap - 1, len - 1);
     99     }
    100 }
    101 
    102 /*
    103 * 归并排序(从下往上)
    104 *
    105 * 参数说明:
    106 *     a -- 待排序的数组
    107 *     len -- 数组的长度
    108 */
    109 void merge_sort_down2up(int a[], int len)
    110 {
    111     int n;
    112 
    113     if (a == NULL || len <= 0)
    114         return;
    115 
    116     for (n = 1; n < len; n *= 2)
    117         merge_groups(a, len, n);
    118 }
    119 
    120 void main()
    121 {
    122     int i;
    123     int a[] = { 80, 30, 60, 40, 20, 10, 50, 70 };
    124     int ilen = LENGTH(a);
    125 
    126     printf("before sort:");
    127     for (i = 0; i<ilen; i++)
    128         printf("%d ", a[i]);
    129     printf("
    ");
    130 
    131     merge_sort_up2down(a, 0, ilen - 1);        // 归并排序(从上往下)
    132     //merge_sort_down2up(a, ilen);            // 归并排序(从下往上)
    133 
    134     printf("after  sort:");
    135     for (i = 0; i<ilen; i++)
    136         printf("%d ", a[i]);
    137     printf("
    ");
    138 }
  • 相关阅读:
    导入myeclipse项目出现的问题及解决方案
    sqlserver允许远程连接的配置
    Microsoft SQL Server,附加数据库 错误:Error 916解决方法
    [svc]linux常用手头命令-md版-2017年11月12日 12:31:56
    [elk]es增删改查最佳实战
    [docker]docker日志驱动记录nginx日志情形探究
    [js]面向对象2
    [js]面向对象1
    [js]js中函数传参判断
    [k8s]k8s-ceph-statefulsets-storageclass-nfs 有状态应用布署实践
  • 原文地址:https://www.cnblogs.com/juncaoit/p/6510070.html
Copyright © 2020-2023  润新知