数据结构之排序算法

来源:互联网 发布:淘宝不能结算怎么回事 编辑:程序博客网 时间:2024/06/05 06:59

#include<iostream>using namespace std;//1、直接插入排序void InsertSort(int a[], int n){for (int i = 1; i<n; i++){if (a[i] < a[i - 1]){             int j = i - 1;               int x = a[i];               //复制为哨兵,即存储待排序元素    while (j>0&&x < a[j]){ a[j + 1] = a[j];j--;            //元素后移    }a[j + 1] = x;      //插入到正确位置    }}}//2、希尔排序:去增量为d1的分为一组,共分成d1组分别进行插入排序,然后每组对应元素放在一起,然后取d2...知道d=1 void ShellSort(int a[], int n){int dk;int tmp;for (dk = n / 2; dk > 0; dk /= 2){for (int i = dk; i < n; i++){tmp = a[i];int j;for (j=i; j >= dk; j -= dk){if (tmp < a[j - dk])a[j] = a[j - dk];else break;}a[j] = tmp;}}}//3、简单选择排序void SelectSort(int a[], int n){for (int i = 0; i<n - 1; i++){int k = i;        //记录最小的那个下标的  for (int j = i + 1; j < n; j++){if (a[j] < a[k]){k = j;}}if (k != i){int t = a[i];a[i] = a[k];a[k] = t;}}}//4、堆排序(Heap Sort)/*-----------------------------------------------------------------------------堆排序是一种树形选择排序,是对直接选择排序的有效改进。初始时把要排序的n个数的序列看作是一棵顺序存储的二叉树(一维数组存储二叉树),调整它们的存储序,使之成为一个堆,将堆顶元素输出,得到n 个元素中最小(或最大)的元素,这时堆的根节点的数最小(或者最大)。然后对前面(n-1)个元素重新调整使之成为堆,输出堆顶元素,得到n 个元素中次小(或次大)的元素。依此类推,直到只有两个节点的堆,并对它们作交换,最后得到有n个节点的有序序列。称这个过程为堆排序。1. 如何将n 个待排序的数建成堆;2. 输出堆顶元素后,怎样调整剩余n-1 个元素,使其成为一个新堆。 *///堆排序:树形选择排序,将带排序记录看成完整的二叉树,第一步:建立初堆,第二步:调整堆  //第二步:调整堆  void HeapAdjust(int *a, int i, int size)  //调整堆 {int lchild = 2 * i;          //i的左孩子节点序号 int rchild = 2 * i + 1;      //i的右孩子节点序号 int max = i;                 //临时变量 if (i < size / 2)            //如果i不是叶节点就不用进行调整 {if (lchild <= size&&a[lchild]>a[max]){max = lchild;}if (rchild <= size&&a[rchild]>a[max]){max = rchild;}if (max != i){swap(a[i], a[max]);HeapAdjust(a, max, size);    //避免调整之后以max为父节点的子树不是堆 }}}void BuildHeap(int *a, int size)    //建立堆 {int i;for (i = size / 2; i >= 0; --i)    //非叶节点最大序号值为size/2 {HeapAdjust(a, i, size);}}void HeapSort(int *a, int size)    //堆排序 {int i;BuildHeap(a, size);for (i = size-1; i >= 1; i--){swap(a[0], a[i]);              //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面 HeapAdjust(a, 0, i - 1);      //重新调整堆顶节点成为大顶堆}}//5、交换排序—冒泡排序(Bubble Sort)void bubbleSort(int a[], int n){for (int i = 0; i< n - 1; ++i) {for (int j = 0; j < n - i - 1; ++j){if (a[j] > a[j + 1]){int tmp = a[j]; a[j] = a[j + 1];a[j + 1] = tmp;}}}}//6、交换排序—快速排序(Quick Sort)void quicksort(int a[],int left, int right){int i, j, t, temp;if (left > right){return;}temp = a[left];    //temp中存的就是基准数 i = left;j = right;while (i != j){//顺序很重要,要先从右边开始找 while (a[j] >= temp && i<j)j--;//再找右边的 while (a[i] <= temp && i<j)i++;//交换两个数在数组中的位置   if (i<j){t = a[i];a[i] = a[j];a[j] = t;}}//最终将基准数归位 a[left] = a[i];a[i] = temp;quicksort(a,left, i - 1);    //继续处理左边的,这里是一个递归的过程 quicksort(a,i + 1, right);   //继续处理右边的 ,这里是一个递归的过程 } //主函数int main(){int a[8] = { 3, 1, 2, 5, 4, 6, 9, 7 };//InsertSort(a, 8); //直接插入排序//ShellSort(a, 8);//折半插入 //SelectSort(a, 8); //简单选择排序//HeapSort(a, 8);  //堆排序//bubbleSort(a, 8);//冒泡排序quicksort(a, 0, 7);for (int i = 0; i<8; i++)cout << a[i];}