[Thuật toán] Các thuật toán sắp xếp trong lập trình C - Heap Sort - Vun đống

Share:

  1. Bubble sort. (Nổi bọt, nổi bong bóng)
  2. Quick sort. (Sắp xếp nhanh)
  3. Simple selection sort. (Sắp xếp chọn)
  4. Heap sort. (Sắp xếp vun đống)
  5. Simple insertion sort.(Sắp xếp chèn)
  6. Shell sort.
  7. Merge sort. (Sắp xếp hòa nhập)

Sắp xếp vun đống (heapsort) là một trong các phương pháp sắp xếp chọn. Ở mỗi bước của sắp xếp chọn ta chọn phần tử lớn nhất (hoặc nhỏ nhất) đặt vào cuối (hoặc đầu) danh sách, sau đó tiếp tục với phần còn lại của danh sách. Thông thường sắp xếp chọn chạy trong thời gian O(n2). Nhưng heapsort đã giảm độ phức tạp này bằng cách sử dụng một cấu trúc dữ liệu đặc biệt được gọi là đống (heap). Đống là cây nhị phân mà trọng số ở mỗi đỉnh cha lớn hơn hoặc bằng trọng số các đỉnh con của nó. Một khi danh sách dữ liệu đã được vun thành đống, gốc của nó là phần tử lớn nhất, thuật toán sẽ giải phóng nó khỏi đống để đặt vào cuối danh sách. Sắp xếp vun đống chạy trong thời gian O(n log n).
Thuật toán sắp xếp vun đống - tinhoccoban.net
Thuật toán sắp xếp vun đống



C++ Code:
  1. #include < iostream.h >
  2. #include < conio.h >
  3. int heapSize = 10;
  4. void print(int a[])
  5. {
  6.   for (int i = 0; i <= 9; i++)
  7.  {
  8.     cout << a[i] << "-";
  9.   }
  10.   cout << endl;
  11. }
  12. int parent(int i)
  13. {
  14. if(i==1)
  15. return 0;
  16. if(i%2==0)
  17.     return ( (/ 2)-1);
  18. else
  19.     return ( (/ 2));
  20. }
  21. int left(int i)
  22. {
  23.   return (2 * i) + 1;
  24. }
  25. int right(int i)
  26. {
  27.   return (2 * i) + 2;
  28. }
  29. void heapify(int a[]int i)
  30. {
  31.   int l = left(i), great;
  32.   int r = right(i);
  33.   if ( (a[l] > a[i]) && (< heapSize))
  34.  {
  35.     great = l;
  36.   }
  37.   else {
  38.     great = i;
  39.   }
  40.   if ( (a[r] > a[great]) && (< heapSize))
  41.  {
  42.     great = r;
  43.   }
  44.   if (great != i)
  45.  {
  46.     int temp = a[i];
  47.     a[i] = a[great];
  48.     a[great] = temp;
  49.     heapify(a, great);
  50.   }
  51. }
  52. void BuildMaxHeap(int a[])
  53. {
  54.  for (int i = (heapSize - 1) / 2; i >= 0; i--)
  55.  {
  56.     heapify(a, i);
  57.     print(a);
  58.   }
  59. }
  60. void HeapSort(int a[]) {
  61.   BuildMaxHeap(a);
  62.   for (int i = heapSize; i > 0; i--)
  63.  {
  64.     int temp = a[0];
  65.     a[0] = a[heapSize - 1];
  66.     a[heapSize - 1] = temp;
  67.     heapSize = heapSize - 1;
  68.     heapify(a, 0);
  69.   }
  70. }
  71. void main()
  72. {
  73.   int arr[] = {2936145708};
  74.   HeapSort(arr);
  75.   print(arr);
  76. }