C++常见排序方法实现
2012-03-07 23:20
711 查看
#pragma once /* *description:排序算法类 *author: qjf *Date: 2012/3/2 **/ class MySort { public: MySort(void); ~MySort(void); static void Bubble_sort(int* arr,unsigned int size); //冒泡排序 static void Insert_sort(int* arr,unsigned int size); //插入排序 static void Heap_sort(int* arr, unsigned int size); //堆排序 static void Dicho_sort(int* arr,unsigned int size); //二分排序 static void Celerity_sort(int* arr,unsigned int sIndex,unsigned int size); //快速排序 private: static void Adjust_heap(int* arr,unsigned int size,unsigned int pos); //调整堆 }; #include "StdAfx.h" #include "MySort.h" MySort::MySort(void) { } MySort::~MySort(void) { } /* *@description: 冒泡排序 *@param arr: 待排序数组 *@param size: 数组大小 */ void MySort::Bubble_sort(int *arr, unsigned int size) { if (size == 0) return; int temp,i,j; for (i = 0; i < size-1; i++) { for (j = i+1; j < size ; j++) { if (arr[i] > arr[j]) { temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } /* *@description: 插入排序 *@param arr: 待排序数组 *@param size: 数组大小 */ void MySort::Insert_sort(int* arr,unsigned int size) { if(size == 0) return; int i,j,temp; for (i=1;i<size;i++) { temp = arr[i]; //如果满足条件则元素向后移动 for (j = i;j>0&&temp>arr[j-1];j--) { arr[j] = arr[j-1]; } //插入 arr[j] = temp; } } /* *@description: 堆排序 *@param arr: 待排序数组 *@param size: 数组大小 */ void MySort::Heap_sort(int* arr, unsigned int size) { if(size == 0) return; int i = size/2-1; int temp; for (i;i>=0;--i) { Adjust_heap(arr,size,i); //调整堆 } //创建最大堆 //循环依次取出最小元素,即每取一个数则都把堆顶元素与堆尾元素交换 //然后再对剩下的i个元素(即从0到i,已取出的元素则换至每次的堆尾不进行调整) //调整堆... for (i=size-1;i>0;--i) { temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; Adjust_heap(arr,i,0); } } /* *@description: 二分插入排序 *@param arr: 待排序数组 *@param size: 数组大小 */ void MySort::Dicho_sort(int* arr,unsigned int size) { if (size == 0) return; //key 要插入的元素,left 左位置,right 右位置 int key, left, right, middle; for (int i=1; i<size; i++) { key = arr[i]; left = 0; right = i-1; while (left<=right) { middle = (left+right)/2; if (arr[middle]>key) right = middle-1; else left = middle+1; } //查找到元素插入的位置则之后的元素都像后移一位 for(int j=i-1; j>=left; j--) { arr[j+1] = arr[j]; } arr[left] = key; } } /* *@description: 调整堆 *@param arr: 待调整数组 *@param size: 数组大小 *@param pos: 待调整的父节点位置 */ void MySort::Adjust_heap(int* arr,unsigned int size,unsigned int pos) { if (size == 0) return; int temp,nchild=0; for (temp = arr[pos];2*pos+1<size;pos=nchild) { nchild = 2*pos+1; //左节点位置 //选择子节点中最大的节点元素 if (nchild<size-1 && arr[nchild] < arr[nchild + 1]) { ++nchild; } //如果父节点小于子节点则交换 if (temp < arr[nchild] ) { arr[pos] = arr[nchild]; } else break; arr[nchild] = temp; } } /* *@description: 快速排序 *@param arr: 待排序数组 *@param startIndex: 开始位置 *@param size: 结束位置 */ void MySort::Celerity_sort(int* arr,unsigned int startIndex ,unsigned int endIndex) { if (endIndex ==0 || startIndex >= endIndex) return; int start = startIndex,end = endIndex; int key = arr[startIndex]; //取关键元素 int temp; //将比关键元素大的放在关键元素后面 //将比关键元素小的放在关键元素前面 while(start != end) { //从后往前比较 while(arr[end] >= key && start < end) end--; temp = arr[end]; arr[end] = arr[start]; arr[start] = temp; //从前往后比较 while(arr[start] <= key && start < end) start++; temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; } arr[start] = key; Celerity_sort(arr,startIndex,start); Celerity_sort(arr,start + 1,endIndex); }
相关文章推荐
- 常见排序的原理和C++实现(一)——STL库中sort的使用方法
- Java实现几种常见排序方法(下)
- java学习笔记-Java实现几种常见排序方法
- Java实现几种常见排序方法
- Java实现几种常见排序方法
- Java实现几种常见排序方法
- Java实现几种常见排序方法
- 用C++实现七种排序算法,可选择排序方法,简单易懂。
- 常见的排序方法 c++
- 直接选择排序的C++实现及随机数组的产生方法
- Java实现几种常见排序方法(上)
- Java实现几种常见排序方法
- Java实现几种常见排序方法
- Java实现几种常见排序方法
- Java实现几种常见排序方法
- Java实现几种常见排序方法
- Java实现几种常见排序方法(下) .
- Java实现几种常见排序方法
- 【数据结构】常见的排序方法的实现以及性能对比
- MATLAB与C++混合编程:动态链接库方法实现混合编程及常见错误解决办法