网站建设公司怎样,wordpress网站迁移教程,杭州seo价格,肇庆市建设企业网站怎么样目录
一 堆排序
二 直接选择排序 一 堆排序
堆排序(Heapsort)是指利用堆积树#xff08;堆#xff09;这种数据结构所设计的一种排序算法#xff0c;它是选择排序的一种。它是 通过堆来进行选择数据。
需要注意的是排升序要建大堆#xff0c;排降序建小堆。
直接选择排…目录
一 堆排序
二 直接选择排序 一 堆排序
堆排序(Heapsort)是指利用堆积树堆这种数据结构所设计的一种排序算法它是选择排序的一种。它是 通过堆来进行选择数据。
需要注意的是排升序要建大堆排降序建小堆。
直接选择排序的特性总结
1. 堆排序使用堆来选数效率就高了很多。
2. 时间复杂度O(N * logN)
3. 空间复杂度O(1)
4. 稳定性不稳定
void Swap(int* x, int* y)
{int tmp *x;*x *y;*y tmp;
}
void AdjustDown(int* a, int n, int parent)
{int child parent * 2 1;while (child n){if (child 1 n a[child 1] a[child]){child;}if (a[child] a[parent]){Swap(a[child], a[parent]);parent child;child parent * 2 1;}else{break;}}
}void HeapSort(int* a, int n)
{//向下调整建堆//O(N)for (int i (n - 1 - 1) / 2; i 0; i--){AdjustDown(a, n, i);}//堆排序//O(N*logN)int end n - 1;while (end 0){Swap(a[0], a[end]);AdjustDown(a, end, 0);end--;}
}int main()
{int arr[] { 2, 3, 5, 7, 4, 6, 8};//InsertSort(arr, sizeof(arr) / sizeof(int));//排升序//InsertSort(arr, sizeof(arr) / sizeof(int));//排升序HeapSort(arr, sizeof(arr) / sizeof(int));//排升序for (int i 0; i sizeof(arr) / sizeof(int); i){printf(%d , arr[i]);}
} 我们可以算算向下建堆的时间复杂度 二 直接选择排序
直接选择排序的特性总结
1. 直接选择排序思考非常好理解但是效率不是很好。实际中很少使用
2. 时间复杂度O(N^2)
3. 空间复杂度O(1)
4. 稳定性不稳定
void SelectSort(int* a, int n)
{int begin 0, end n - 1;while (begin end){int mini begin;int maxi begin;for (int i begin 1; i end; i){if (a[i] a[mini]){mini i;}if (a[i] a[maxi]){maxi i;}}Swap(a[mini], a[begin]);//检查maxi是否被换走了if (maxi begin){maxi mini;}Swap(a[maxi], a[end]);begin;end--;}
}
本节的重点是堆排序, 对二叉树的顺序结构基础要求很高, 大家如果基础不好或者不太理解,可以看看我二叉树的博客.
继续加油!