C++: 7种排序 算法原理展示
2014-08-19 19:15
363 查看
#include <iostream> #include <stdlib.h> #include <string.h> #include <windows.h> #define MAX 10 using namespace std; // 最大堆调整 void MaxHeapify(int *a, int i, int heapSize) { int l = (i + 1) * 2 - 1; int r = (i + 1) * 2; int largest; if (l <= heapSize && a[l]>a[i]) largest = l; else largest = i; if (r <= heapSize && a[r]>a[largest]) largest = r; if (largest != i) { swap(a[i], a[largest]); MaxHeapify(a, largest, heapSize); } } // 创建最大堆 void BuildMaxHeap(int *a, int len) { for (int i = len / 2 - 1; i >= 0; i--) { MaxHeapify(a, i, len - 1); } } // 堆排序 void HeapSort(int *a, int len) { BuildMaxHeap(a, len); for (int i = len - 1; i>0; i--) { swap(a[0], a[i]); MaxHeapify(a, 0, i - 1); } } void QuickSort(int array[], int left, int right) { if (left < right) { int pivot = array[left]; int low = left; int high = right; while (low < high) { while (low < high && array[high] > pivot) { high--; } array[low] = array[high]; while (low < high && array[low] < pivot) { low++; } array[high] = array[low]; } array[low] = pivot; QuickSort(array, left, low - 1); QuickSort(array, low + 1, right); } } void Merge(int *a, int begin, int mid, int end) { int len1 = mid - begin + 1; int len2 = end - mid; int *L = new int[len1 + 1]; int *R = new int[len2 + 1]; int i, j, k; for (i = 0; i<len1; i++) L[i] = a[begin + i]; for (j = 0; j<len2; j++) R[j] = a[mid + j + 1]; L[len1] = 10000000; R[len2] = 10000000; for (i = 0, j = 0, k = begin; k <= end; k++) { if (L[i] <= R[j]) a[k] = L[i++]; else a[k] = R[j++]; } delete[]L; delete[]R; } void MergeSort(int array[], int begin, int end) { if (begin < end) { int mid = (begin + end) / 2; MergeSort(array, begin, mid); MergeSort(array, mid + 1, end); Merge(array, begin, mid, end); } } void BubbleSort(int array[]) { for (int i = 0; i < MAX; i++) { for (int j = MAX-1; j > i; j--) { if (array[j] < array[j - 1]) { int temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } } cout << "The Bubble_sorted array is :" << endl; for (int i = 0; i < MAX; i++) { cout << array[i] << '\t'; } cout << endl; } void SelectSort(int array[]) { for (int i = 0; i < MAX - 1; i++) { int current = array[i]; int least = i; for (int j = i + 1; j < MAX; j++) { if (array[j] < current) { least = j; current = array[least]; } } if (least != i)//swap { array[i] += array[least]; array[least] = array[i] - array[least]; array[i] = array[i] - array[least]; } } cout << "The Select_sorted array is :" << endl; for (int i = 0; i < MAX; i++) { cout << array[i] << '\t'; } cout << endl; } void ShellSort(int array[]) { int gap = 1; gap = (MAX / 3) * 3 + 1; while (gap > 0) { for (int j = gap; j < MAX; j++) { int current = array[j]; int i = j - gap; while (array[i] > current && i >= 0) { array[i + gap] = array[i]; i -= gap; } array[i + gap] = current; } gap /= 3; } cout << "The shell_sorted array is :" << endl; for (int i = 0; i < MAX; i++) { cout << array[i] << '\t'; } cout << endl; } void InsertSort(int array[]) { for (int i = 1; i < MAX; i++) { int current = array[i]; int j = i - 1; while (array[j] > current && j >= 0) { array[j + 1] = array[j]; j--; } array[j+1] = current; } cout << "The insert_sorted array is :" << endl; for (int i = 0; i < MAX; i++) { cout << array[i] << '\t'; } cout << endl; } int main() { int Array[MAX]; cout << "The initial array is :" << endl; for (int i = 0; i < MAX; i++) { Array[i] = rand()%100; cout << Array[i] << '\t'; } cout << endl; int TimeStart =int( GetTickCount()); //InsertSort(Array); //ShellSort(Array); //SelectSort(Array); //BubbleSort(Array); //MergeSort(Array,0,MAX-1); //QuickSort(Array, 0, MAX - 1); HeapSort(Array, MAX); cout << "The heap_sorted array is :" << endl; for (int i = 0; i < MAX; i++) { cout << Array[i] << '\t'; } cout << endl; int TimeEnd = int(GetTickCount()); cout << "The running time is " << TimeEnd - TimeStart << endl; system("PAUSE"); return 0; }
先贴上代码:(其中对排排序借鉴了http://blog.csdn.net/left_la/article/details/8657199)
后期完善算法总结及算法原理展示图:
相关文章推荐
- 查找等等)资料也可 求一本基于C/C++囊括经典算法的书籍(排序
- 各种算法的C#实现系列1 - 合并排序的原理及代码分析
- 排序算法用C++的基本算法实现十个数排序
- 【算法导论】C++参考源码之基础排序
- 从零开始学C++之STL(四):算法简介、7种算法分类
- C++中排序的算法分析(文字分析)
- 算法数据结构C++ - Bucket Sort 吊桶排序
- 用C++的基本算法实现十个数排序
- java 基础知识-数组的7种算法(排序、求和、最值、遍历...)
- 【算法导论】C++参考源码之线性时间排序
- 漂亮的排序算法:7种排序算法的内存状态演示
- 每日一算法之直接插入排序的原理及实现
- 每日一算法之选择排序原理及实现
- 用C++的基本算法实现十个数排序
- 实现一个简单的c++ list容器(含sort排序 链表归并算法实现)
- C++ 之 高效使用STL(泛型算法设计原理解析)
- 几种常用的排序算法:插入排序、冒泡排序、选择排序的算法及C++实现
- 合并(归并)排序 算法原理与实现
- c++排序和去除重复的算法
- 用C++模板来展示new与delete操作符原理