数据结构排序——选择排序与堆排序(c语言实现)
今天继续排序的内容:
文章目录
- 1.选择排序
- 1.1基本介绍
- 1.2代码实现
- 1.2.1基础款
- 1.2.2进阶款
- 2.堆排序
- 2.1基本介绍
- 2.2代码实现
1.选择排序
1.1基本介绍
选择排序(Selection Sort):是一种简单直观的排序算法.它的基本思想是在未排序序列中找到最小(大)的元素,放到序列的起始位置,然后再从剩余未排序元素中找到最小(大)的元素,放到已排序序列的末尾。重复这个过程,直到所有元素都排好序。
选择排序的特性:
- 直接选择排序思考非常好理解,但是效率不是很好,所以很少使用
- 时间复杂度:O(N^2)
- 空间复杂度:O(1)
- 稳定性:不稳定
1.2代码实现
1.2.1基础款
void Swap(int* x, int* y) { int tmp = *x; *x = *y; *y = tmp; } void SelectSort(int* a, int n)//升序 { for (int i = 0; i < n-1; i++)//n个数据,排n-1次 { int mini = i;//0到i-1都已经排好,下一个就放在i这个位置上 for (int j = i+1; j < n; j++)//从i到n-1找最小的,因为本身是i,所以j可以中i+1开始 { if (a[minf] > a[j]) { minf = j;//找到小的就来替换 } } Swap(&a[minf], &a[i]); } } int main() { int a[] = { 9,1,2,5,7,4,8,6,3,5,1,2,3,5,1,8,3 }; printf("排序前:"); for (int i = 0; i < sizeof(a) / sizeof(int); i++) { printf("%d ", a[i]); } printf("\n"); SelectSort(a, sizeof(a) / sizeof(int)); printf("排序后:"); for (int i = 0; i < sizeof(a) / sizeof(int); i++) { printf("%d ", a[i]); } printf("\n"); return 0; }
1.2.2进阶款
之前都是一次选一个最小的放在左侧。现在一次选出最大和最小,分别放在左侧和右侧
void SelectSort(int* a, int n)//升序 { int begin = 0, end = n - 1; while (begin < end) //begin=end时就已经排好了 { int mini = begin, maxi = begin;//不知道会指向哪里,所以要每次都初始化 for (int i = begin + 1; i <= end; i++)//从begin到end找最大和最小 { if (a[i] < a[mini]) { mini = i; } if (a[i] > a[maxi]) { maxi = i; } } Swap(&a[begin], &a[mini]);//最小跟begin换 if (begin == maxi)//有可能begin位置就是此时最大的,maxi=begin,要是交换了,maxi值就不对了 { maxi = mini;//让maxi仍是最大的数据的索引(此时数据被换到mini所指) } Swap(&a[end], &a[maxi]); begin++; end--; } }
2.堆排序
2.1基本介绍
之前在堆应用这篇文章我已经讲过了堆排序和TOP-K问题,详细可见:堆的应用:堆排序和TOP-K问题
那这次就再次大致讲解一下
如果是升序,就建立大堆;是降序就建立小堆。
因为思路是(以升序为例):大堆的堆顶一定是最大的,我们就把堆顶与堆尾交换后,除去最后一个对新堆顶进行向下调整。完成后,堆顶与倒数第二个交换…
2.2代码实现
#define _CRT_SECURE_NO_WARNINGS 1 #include"Heap.h" void Swap(HPDataType* p1, HPDataType* p2) { HPDataType tmp = *p1; *p1 = *p2; *p2 = tmp; } void AdjustUp(HPDataType* a, int child) { int father = (child - 1) / 2; while (child > 0) { if (a[child] > a[father]) { Swap(&a[child], &a[father]); //更新下标 child = father; father = (father - 1) / 2; } else { break;//一旦符合小堆了,就直接退出 } } } void AdjustDown(HPDataType* a, int n, int father) { int child = father * 2 + 1;//假设左孩子大 while (child < n) { if (child + 1 < n && a[child] < a[child + 1]) { child++; } if (a[child] > a[father]) { Swap(&a[child], &a[father]); father = child; child = father * 2 + 1; } else { break; } } } void HeapSort(int* arr, int n)//升序 { //先建大堆 for (int i = 0; i < n; i++) { AdjustUp(arr, i); } int a = n - 1; while (a > 0) { //此时最大的是堆顶,堆顶跟最后一个交换 Swap(&arr[0], &arr[a]); //现在最大的已经在最后了,不考虑它,把新塔顶降下来,重新编程大堆 AdjustDown(arr, a, 0); a--; } } int main() { int arr[]= { 4,6,2,1,5,8,2,9 }; for (int i = 0; i < sizeof(arr) / sizeof(int); i++) { printf("%d ", arr[i]); } printf("\n"); HeapSort(arr, sizeof(arr) / sizeof(int)); for (int i = 0; i < sizeof(arr) / sizeof(int); i++) { printf("%d ", arr[i]); } }
这次就到这里啦,感谢大家支持!!!
猜你喜欢
- 12天前(三亚海棠湾君悦度假酒店)三亚海棠湾君悦酒店暑期夏令营悦趣海岛游招募中
- 12天前(夏日旅行海报)夏日旅行|精简行囊 向快乐进发
- 12天前(七尚酒店百度百科)Lohkah七尚酒店首度开创充满新知的闽地研学旅程
- 12天前(河南省文旅大会精神)2025河南省文化旅游发展大会新闻发布会在郑州召开
- 12天前(云南南博会展馆)旅居云南馆亮相第9届南博会
- 12天前(重庆恐龙化石遗址)重庆黔江恐龙化石抢救性发掘新闻发布会举行
- 12天前(马尔代夫华尔道夫酒店多少钱)Chef Zhao就任马尔代夫伊挞富士岛华尔道夫酒店Li Long中餐厅新主厨
- 12天前(万豪旅享家活动2021)精彩上新,漫享夏日----跟随万豪旅享家新开酒店解锁夏日旅行灵感
- 12天前(“三天跨两城”催生租车新需求,神州租车清明跨城订单同比增长416%)“三天跨两城”催生租车新需求,神州租车清明跨城订单同比增长416%
- 12天前(筑格集团有限公司)洲际酒店集团旗下筑格酒店品牌正式亮相大中华区
网友评论
- 搜索
- 最新文章
- (2020广州车展哈弗)你的猛龙 独一无二 哈弗猛龙广州车展闪耀登场
- (哈弗新能源suv2019款)智能科技颠覆出行体验 哈弗重塑新能源越野SUV价值认知
- (2021款全新哈弗h5自动四驱报价)新哈弗H5再赴保障之旅,无惧冰雪护航哈弗全民电四驱挑战赛
- (海南航空现况怎样)用一场直播找到市场扩张新渠道,海南航空做对了什么?
- (visa jcb 日本)优惠面面俱到 JCB信用卡邀您畅玩日本冰雪季
- (第三届“堡里有年味·回村过大年”民俗花灯会活动)第三届“堡里有年味·回村过大年”民俗花灯会活动
- (展示非遗魅力 长安启源助力铜梁龙舞出征)展示非遗魅力 长安启源助力铜梁龙舞出征
- (阿斯塔纳航空公司)阿斯塔纳航空机队飞机数量增至50架
- (北京香港航班动态查询)香港快运航空北京大兴新航线今日首航
- (我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉)我在港航“呵护”飞机 每一次安全着陆就是最好的荣誉
- 热门文章