• 八大排序算法总结


     1.关键代码段

    选择排序

     1 void Selectsort(int a[], int n)
     2 {
     3     int i, j, nMinIndex;
     4     for (i = 0; i < n; i++)
     5     {
     6         nMinIndex = i; //找最小元素的位置
     7         for (j = i + 1; j < n; j++)
     8             if (a[j] < a[nMinIndex])
     9                 nMinIndex = j;
    10 
    11         Swap(a[i], a[nMinIndex]); //将这个元素放到无序区的开头
    12     }
    13 }

    堆排序

     1 //  从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2
     2 void MinHeapFixdown(int a[], int i, int n)
     3 {
     4     int j, temp;
     5     temp = a[i];
     6     j = 2 * i + 1;
     7     while (j < n)
     8     {
     9         if (j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的
    10             j++;
    11         if (a[j] >= temp)
    12             break;
    13         a[i] = a[j];     //把较小的子结点往上移动,替换它的父结点
    14         i = j;
    15         j = 2 * i + 1;
    16     }
    17     a[i] = temp;
    18 }
    19 
    20 //建立最小堆
    21 void MakeMinHeap(int a[], int n)
    22 {
    23     for (int i = n / 2 - 1; i >= 0; i--)
    24         MinHeapFixdown(a, i, n);
    25     print(a,10);
    26 }
    27 
    28 //最小堆排序
    29 void MinheapsortTodescendarray(int a[], int n)
    30 {
    31     for (int i = n - 1; i >= 1; i--)
    32     {
    33         Swap(a[i], a[0]);
    34         MinHeapFixdown(a, 0, i);
    35     }
    36     print(a, 10);
    37 }
    38 
    39 // 堆排序
    40 void HeapSort(int a[],int n)
    41 {
    42     MakeMinHeap(a, n);
    43     MinheapsortTodescendarray(a, n);
    44 }

    冒泡排序

     1 void bubbleSort(int a[], int n)
     2 {  
     3     for(int i =0 ; i< n-1; ++i) 
     4     {  
     5         for(int j = 0; j < n-1-i; ++j) //for(int j = n-1; j > i; j--)
     6         {  
     7             if(a[j] > a[j+1])  
     8             {  
     9                 int tmp = a[j] ; 
    10                 a[j] = a[j+1] ;  
    11                 a[j+1] = tmp;  
    12             }  
    13         }      
    14         print(a,n,i);
    15     }  
    16 }

    直接插入排序

     1 void Insertsort1(int a[], int n)
     2 {
     3     int i, j, k;
     4     for (i = 1; i < n; i++)
     5     {
     6         //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置
     7         for (j = i - 1; j >= 0; j--)
     8             if (a[j] <= a[i]) //注意插入排序是稳定的,所以a[j]=a[i]时也不处理
     9                 break;
    10 
    11         //如找到了一个合适的位置
    12         if (j != i - 1)
    13         {
    14             //将比a[i]大的数据向后移
    15             int temp = a[i];
    16             for (k = i - 1; k > j; k--)
    17                 a[k + 1] = a[k];
    18             //将a[i]放到正确位置上
    19             a[k + 1] = temp;
    20         }
    21     }
    22 }

    希尔排序

     1 void shellsort1(int a[], int n)
     2 {
     3     int i, j, gap;
     4 
     5     for (gap = n / 2; gap > 0; gap /= 2) //步长
     6     {
     7         for (i = 0; i < gap; i++)        //直接插入排序
     8         {
     9             for (j = i + gap; j < n; j += gap) 
    10                 if (a[j] < a[j - gap])
    11             {
    12                 int temp = a[j];
    13                 int k = j - gap;
    14                 while (k >= 0 && a[k] > temp)
    15                 {
    16                     a[k + gap] = a[k];
    17                     k -= gap;
    18                 }
    19                 a[k + gap] = temp;
    20             }
    21         }
    22     }
    23 }

    快速排序

     1 //快速排序
     2 void quick_sort(int s[], int l, int r)
     3 {
     4     if (l < r)
     5     {
     6       //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
     7         int i = l, j = r, x = s[l];
     8         while (i < j)
     9         {
    10             while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
    11             j--;  
    12             if(i < j) 
    13             s[i++] = s[j];
    14             
    15             while(i < j && s[i] < x) // 从左向右找第一个大于等于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 }

    归并排序

     1 //将有二个有序数列a[first...mid]和a[mid...last]合并。
     2 void mergearray(int a[], int first, int mid, int last, int temp[])
     3 {
     4     int i = first, j = mid + 1;
     5     int m = mid,   n = last;
     6     int k = 0;
     7     
     8     while (i <= m && j <= n)
     9     {
    10         if (a[i] <= a[j])
    11             temp[k++] = a[i++];
    12         else
    13             temp[k++] = a[j++];
    14     }
    15     
    16     while (i <= m)
    17         temp[k++] = a[i++];
    18     
    19     while (j <= n)
    20         temp[k++] = a[j++];
    21     
    22     for (i = 0; i < k; i++)
    23         a[first + i] = temp[i];
    24 }
    25 void mergesort(int a[], int first, int last, int temp[])
    26 {
    27     if (first < last)
    28     {
    29         int mid = (first + last) / 2;
    30         mergesort(a, first, mid, temp);    //左边有序
    31         mergesort(a, mid + 1, last, temp); //右边有序
    32         mergearray(a, first, mid, last, temp); //再将二个有序数列合并
    33     }
    34 }
    35 
    36 bool MergeSort(int a[], int n)
    37 {
    38     int *p = new int[n];
    39     if (p == NULL)
    40         return false;
    41     mergesort(a, 0, n - 1, p);
    42     delete[] p;
    43     return true;
    44 }

    基数排序

      1 #include "stdafx.h"
      2 #include <iostream>
      3 #include <math.h>
      4 using namespace std;
      5 
      6 //查询数组中的最大数
      7 int findMaxNum(int *p, int n)
      8 {
      9     int i;
     10     int max = 0;
     11     for (i = 0; i < n; i++)
     12     {
     13         if (*(p + i) > max)
     14         {
     15             max = *(p + i);
     16         }
     17     }
     18     return max;
     19 }
     20 //获取数字的位数
     21 int getLoopTimes(int num)
     22 {
     23     int count = 1;
     24     int temp = num / 10;
     25     while (temp != 0)
     26     {
     27         count++;
     28         temp = temp / 10;
     29     }
     30     return count;
     31 }
     32 
     33 //将数字分配到各自的桶中,然后按照桶的顺序输出排序结果
     34 void sort2(int *p, int n, int loop)
     35 {
     36     //建立一组桶此处的20是预设的根据实际数情况修改
     37     int buckets[10][20] = {};
     38     //求桶的index的除数
     39     //如798个位桶index=(798/1)%10=8
     40     //十位桶index=(798/10)%10=9
     41     //百位桶index=(798/100)%10=7
     42     //tempNum为上式中的1、10、100
     43     int tempNum = (int)pow(10, loop - 1);
     44     int i, j;
     45     for (i = 0; i < n; i++)
     46     {
     47         int row_index = (*(p + i) / tempNum) % 10;
     48         for (j = 0; j < 20; j++)
     49         {
     50             if (buckets[row_index][j] == NULL)
     51             {
     52                 buckets[row_index][j] = *(p + i);
     53                 break;
     54             }
     55         }
     56     }
     57     //将桶中的数,倒回到原有数组中
     58     int k = 0;
     59     for (i = 0; i < 10; i++)
     60     {
     61         for (j = 0; j < 20; j++)
     62         {
     63             if (buckets[i][j] != NULL)
     64             {
     65                 *(p + k) = buckets[i][j];
     66                 buckets[i][j] = NULL;
     67                 k++;
     68             }
     69         }
     70     }
     71 }
     72 
     73 //基数排序
     74 void bucketSort3(int *p, int n)
     75 {
     76     //获取数组中的最大数
     77     int maxNum = findMaxNum(p, n);
     78     //获取最大数的位数,次数也是再分配的次数。
     79     int loopTimes = getLoopTimes(maxNum);
     80     int i;
     81     //对每一位进行桶分配
     82     for (i = 1; i <= loopTimes; i++)
     83     {
     84         sort2(p, n, i);
     85     }
     86 }
     87 void testBS()
     88 {
     89     int a[] = { 2, 343, 342, 1, 123, 43, 4343, 433, 687, 654, 3 };
     90     int *a_p = a;
     91     //计算数组长度
     92     int size = sizeof(a) / sizeof(int);
     93     //基数排序
     94     bucketSort3(a_p, size);
     95     //打印排序后结果
     96     int i;
     97     for (i = 0; i < size; i++)
     98     {
     99         printf("%d
    ", a[i]);
    100     }
    101 }
    102 
    103 int _tmain(int argc, _TCHAR* argv[])
    104 {
    105     testBS();
    106 
    107     system("pause");
    108     return 0;
    109 }

    2.性能比较 

  • 相关阅读:
    在Win10的注册表编辑器中如何快速跳转到相关键值?
    使用winsw给Win10添加服务
    巧把任意程序添加到Win10控制面板(添加“系统配置”为例)
    在Win8.1开始屏幕添加电源按钮
    win10中,如何隐藏此电脑中的6个文件夹?
    Win10恢复这台电脑里的6个文件夹
    解决Office 2010安装报错1907,没有足够权限注册字体。
    C#面向对象(OOP)入门—第二天—多态和继承(继承)
    C#面向对象(OOP)入门—第一天—多态和继承(方法重载)
    OpenCV与Python之图像的读入与显示以及利用Numpy的图像转换
  • 原文地址:https://www.cnblogs.com/SnailProgramer/p/4848564.html
Copyright © 2020-2023  润新知