选择排序和堆排序
2017-07-02 11:23
323 查看
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法,选择排序是一种时间复杂度为O(N^2)的算法
堆排序
首先将堆建好之后,在让最后一个数和第一个数交换,交换之后,把之前最后一个数不在当作数组中的数,将第一个数到最后一个数的前一个数进行向下调整算法。直到调整到最后一个数变为第一个数的时候不再需要调整,堆排序的升序也已经排列好了。
void SelectSort(int*arr, int n) { int left = 0; int right = n; int i = left; while (left < right) { int min = left; int max = right - 1; for (i=left; i < right; ++i) { if (arr[i] < arr[min]) { min = i; } if (arr[i]>arr[max]) { max = i; } } swap(arr[left], arr[min]); if (max == left) { max = min; } swap(arr[--right], arr[max]); ++left; } }
堆排序
首先将堆建好之后,在让最后一个数和第一个数交换,交换之后,把之前最后一个数不在当作数组中的数,将第一个数到最后一个数的前一个数进行向下调整算法。直到调整到最后一个数变为第一个数的时候不再需要调整,堆排序的升序也已经排列好了。
void AdjustDown(int *arr, int root,int n) { int parent = root; int child = parent * 2 + 1; while (child<n) { if (child + 1 < n&&arr[child] < arr[child + 1]) { ++child; } if (arr[child] > arr[parent]) { swap(arr[child], arr[parent]); } parent = child; child = parent * 2 + 1; } } void HeapSort(int *arr, int n) { int *p = arr; for (int i = (n - 2) / 2; i >= 0; --i) { AdjustDown(arr, i,n); } int end = n - 1; while (end > 0) { swap(arr[0], arr[end]); AdjustDown(arr, 0, end); --end; } }
相关文章推荐
- 选择排序 (直接选择排序 ,堆排序)
- 选择排序(选择排序和堆排序)
- 选择排序——堆排序
- 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, 冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。
- 选择排序和堆排序
- 选择排序与堆排序
- 排序-->选择排序(选择排序&&堆排序)
- 选择排序——堆排序
- 选择排序-【堆排序】
- java数据结构之插入排序(选择排序(直接选择排序、堆排序))
- 选择排序:直接选择排序,堆排序
- 选择排序之堆排序
- 排序算法Java实现——选择排序(堆排序)
- 选择排序——简单选择排序和堆排序,C++代码实现
- 选择排序--选择排序和堆排序
- 选择排序——堆排序
- 选择排序---直接选择排序和堆排序
- 选择排序(直接选择和堆排序)
- 排序(快排,冒泡,堆排序,插入排序,归并排序,选择排序)算法Java实现
- 选择排序(简单选择排序 and 堆排序)