八大排序算法总结

 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.性能比较 

原文地址:https://www.cnblogs.com/SnailProgramer/p/4848564.html