选择(选择排序与堆排序)

 1 #include <iostream>
 2 //交换函数
 3 void qswap(int& p, int& q)
 4 {
 5     int temp = p;
 6     p = q;
 7     q = temp;
 8 }
 9 
10 //选择排序
11 void Sort(int array[], int n)
12 {
13     for (int i = 0; i <n-1; ++i)
14     {
15         int min = i;
16         for (int j = i+1; j < n; ++j)
17         {
18             if (array[min] > array[j])
19             {
20                 min = j;
21             }
22         }
23         if(min!= i)
24         qswap(array[min], array[i]);
25     }
26 }
27 
28 int main()
29 {
30     int ch[] = { 2,4,6,8,3,5,7,9,0,1 };
31     bubbleSort(ch, 10);
32     int length = sizeof(ch) / sizeof(int);
33     for (int i = 0; i < length; ++i)
34     {
35         std::cout << ch[i] << " ";
36     }
37     return 0;
38 }

 堆排序思想:通过将一系列数据按照完全二叉树大顶堆或小顶堆排序,然后将堆得根结点和二叉树的最后结点交换位置。交换位置后,出去最后一个元素继续按照大顶推排序。

 1 #include <iostream>
 2 template<class T>
 3 void swap(T& a, T& b)
 4 {
 5     T temp = a;
 6     a = b;
 7     b = temp;
 8 }
 9 //堆排序
10 void Adiust(int arr[], int s, int m)
11 {
12     int temp = arr[s];
13     int j = 0;
14     for (j = s * 2; j <= m; j *= 2)
15     {
16         if (j < m && arr[j] < arr[j + 1])//找出孩子的最大值下表
17             ++j;
18         if (temp > arr[j])//判断
19             break;
20         arr[s] = arr[j];
21         s = j;
22     }
23     arr[s] = temp;
24 }
25 void HeapSort(int arr[], int n)
26 {
27     if (arr == nullptr || n<1)
28         return;
29     int s;
30     for (s = n / 2; s > 0; --s)//二叉树的双亲结点
31     {
32         Adiust(arr, s, n);
33     }
34 
35     for (s = n; s > 1; --s)
36     {
37         swap(arr[1], arr[s]);
38         Adiust(arr, 1, s-1);
39     }
40 }
41 
42 int main()
43 {
44     int a[] = {0,50,40,10,60,90,70,80,30 };//在a[0]位置添加一个辅助点
45     HeapSort(a, 8);
46     for (int i = 0; i < sizeof(a)/sizeof(int); ++i)
47         std::cout << a[i] << " ";
48     return 0;
49 }

 

posted @ 2020-06-30 14:25  dhhu007  阅读(140)  评论(0编辑  收藏  举报