内部排序之直接选择排序、堆排序
2014-12-13 23:21
260 查看
直接选择排序:
直接选择排序,首先在该序列中找出最小元素并记录其所在的位置ipos1,如果它不在第一个位置,那么将ipos与第一个位置的元素交换,那么,第一个元素就是最小的元素,然后从第二个位置开始,查找剩余中最小的元素并记录其位置ipos2,如果它不在第二个位置,那么将ipo2与第二个位置所在的元素交换................以此类推!
稳定性:(以例说明){8, 8, 3, 5, 1, 6}首先找出最小元素1,与第一个元素8交换,但是第二个元素也是8,交换后两个元素相对于初始时,相对位置发生变化,由此可以看出他是不稳定的!
堆排序是一种稳定排序:
大家可以参考:http://blog.csdn.net/morewindows/article/details/6709644/
写的很好!
照着这个思路,写了一下,依大根堆进行升序堆排序!
直接选择排序,首先在该序列中找出最小元素并记录其所在的位置ipos1,如果它不在第一个位置,那么将ipos与第一个位置的元素交换,那么,第一个元素就是最小的元素,然后从第二个位置开始,查找剩余中最小的元素并记录其位置ipos2,如果它不在第二个位置,那么将ipo2与第二个位置所在的元素交换................以此类推!
稳定性:(以例说明){8, 8, 3, 5, 1, 6}首先找出最小元素1,与第一个元素8交换,但是第二个元素也是8,交换后两个元素相对于初始时,相对位置发生变化,由此可以看出他是不稳定的!
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 110; void Select_Sort(int arr[], int n) { int i, j, ipos; for(i = 0; i < n-1; ++i) { ipos = i; for(j = i+1; j < n; ++j) if(arr[ipos] > arr[j]) ipos = j; if(ipos != i) { arr[i] ^= arr[ipos]; arr[ipos] ^= arr[i]; arr[i] ^= arr[ipos]; } } } int main() { int arr[MAXN], n; while(~scanf("%d", &n)) { if(n == 0) break; for(int i = 0; i < n; ++i) scanf("%d", &arr[i]); Select_Sort(arr, n); for(int i = 0; i < n; ++i) cout<<arr[i]<<" "; cout<<endl; } return 0; }
堆排序是一种稳定排序:
大家可以参考:http://blog.csdn.net/morewindows/article/details/6709644/
写的很好!
照着这个思路,写了一下,依大根堆进行升序堆排序!
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN = 110; void Swap(int &a, int &b) { if(a == b) return ; a ^= b; b ^= a; a ^= b; } void MaxHeapFixUp(int a[], int i)//上调(上升) { int tmp = a[i]; int j = (i-1) >> 1; while(j >= 0 && i != 0) { if(a[j] >= a[i]) break; Swap(a[j], a[i]); i = j; j = (i-1) >> 1; } a[i] = tmp; return ; } void MaxHeapInsert(int a[], int n, int iData) { a = iData; MaxHeapFixUp(a, n); } void MaxHeapFixDown(int a[], int i, int n)//下调(下沉) { int tmp = a[i]; int j = i<<1|1; while(j < n) { if(j+1 < n && a[j+1] >= a[j]) ++j; if(a[i] >= a[j]) break; Swap(a[j], a[i]); i = j; j = i<<1|1; } a[i] = tmp; } void MaxHeapDelete(int a[], int n) { Swap(a[0], a[n-1]); MaxHeapFixDown(a, 0, n-1); } void MaxHeapBuild(int a[], int n) { for(int i = (n-1)>>1; i >= 0; --i) MaxHeapFixDown(a, i, n); } void MaxHeapSort(int a[], int n) { int i; for(i = n-1; i >= 0; --i) { Swap(a[0], a[i]); MaxHeapFixDown(a, 0, i); } } int main() { int n, a[MAXN]; while(~scanf("%d", &n) && n) { memset(a, 0, sizeof(a)); for(int i = 0; i < n; ++i) cin>>a[i]; MaxHeapBuild(a, n); MaxHeapSort(a, n); for(int i = 0; i < n; ++i) cout<<a[i]<<" "; cout<<endl; } return 0; }
相关文章推荐
- 第十八篇:内部排序之三:堆排序(含完整源码)
- 内部排序之三:堆排序
- 内部排序之三:堆排序(含完整源码)
- 数据结构和算法系列6 七大排序之直接选择排序和堆排序
- 经典内部排序: 堆排序,快排,归并排序
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 内部排序之堆排序的实现详解
- 内部排序之三:堆排序
- 内部排序算法之堆排序
- 内部排序之选择排序(直接选择排序,堆排序)
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 内部排序之三:堆排序
- 内部选择排序---堆排序
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- 内部排序之堆排序
- 内部排序之堆排序
- 内部排序-堆排序
- 数据结构和算法系列6 七大排序之直接选择排序和堆排序