堆排序和簡單選擇排序

2021-09-21 06:12:30 字數 1867 閱讀 2593

簡單選擇排序就是每次從i到n-1中選擇最小的數,然後放在第i個位置,其演算法複雜度為o(n2);

堆排序是簡單選擇排序的改進,通過建立最大堆,每次將最大堆的根節點取出放在最後的位置,然後再重新調整為最大堆,時間複雜度為o(nlogn)。

簡單排序演算法

void select_sort(sqlist *l)

/*簡單選擇排序,演算法複雜度為o(n2),不穩定*/

}

2.堆排序演算法

void heap_sort(sqlist *l)

/*堆排序*/

}

堆排序演算法最核心的部分是建立最大堆和最大堆的調整,調整方法為向下過濾法。

向下過濾演算法:在一棵子樹中,對於根結點parent,如果parent的元素值比child中最大的元素要小則交換parent和child的位置。然後令parent=child,繼續比較。這樣這棵子樹為最大堆。

void percdown(sqlist *l, int root, int end)

}

建立最大堆

我們選擇從下到上一步步建立最大堆,逐步向下調整。

void buildmaxheap(sqlist *l)

/*建立最大堆*/

} else//末結點下標為偶數 }

}

完整的測試**

// selection_sort.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。

//#include "pch.h"

#include #include#include#define maxsize 100

typedef int elementtype;

typedef struct

sqlist;

void swap(elementtype *a, elementtype *b)

void displaysqlist(sqlist l)

/*列印序列*/

printf("\n");

}int scanfformin(sqlist l, int left, int right)

/*在序列中找出最小的元素所在的位置*/

return pos;

}void select_sort(sqlist *l)

/*簡單選擇排序,演算法複雜度為o(n2),不穩定*/

}void percdown(sqlist *l, int root, int end)

}void buildmaxheap(sqlist *l)

/*建立最大堆*/

} else//末結點下標為偶數 }

}void heap_sort(sqlist *l)

/*堆排序*/}

int main()

; int len = sizeof(a) / sizeof(a[0]);

for (int i = 0; i < len; i++)

l.length = len;

l1 = l;

printf("排序前:\n");

displaysqlist(l);

printf("簡單選擇排序:\n");

select_sort(&l);

displaysqlist(l);

printf("堆排序:\n");

heap_sort(&l1);

displaysqlist(l1);

}

簡單選擇排序和堆排序

堆排序是基於堆進行排序的演算法,將待排序的序列構造成乙個大頂堆或小頂堆,此時整個序列的最小值或最大值就是堆頂的根結點,將其移走,然後將剩餘的n 1個序列重新構造成乙個堆,這樣就會得到n個元素中的次大值,反覆執行,就可以得到乙個有序序列。簡單選擇排序 public static void select...

簡單選擇排序和堆排序

選擇排序分為簡單選擇排序和堆排序 簡單選擇排序是一種不穩定排序演算法,從未排序序列中選擇關鍵字最小的元素與該序列中第乙個關鍵字交換位置,每一趟排序可以確定乙個元素的最終位置,空間複雜度 o 1 時間複雜度 o n 堆排序是一種不穩定排序演算法,堆排序分為大頂堆和小頂堆,本 所用為大頂堆,基本思路 大...

選擇排序 簡單選擇排序和堆排序

1.簡單選擇排序 1 演算法思想 將序列的第乙個元素當作最小的元素,和後面的元素一一比較,將最小的元素下標標記出來,和第乙個元素進行交換,則一趟下來,第乙個元素一定是最小的,直到所有的元素全部排序完成。2 基本實現 void selectsort datatype arr,int sz if k i...