排序函数(直接InsertSort,希尔ShellSort,选择SelectSort,快排QuickSort,堆排HeapSort,归并MergeSort)的实现(除基数排序)

xiaoxiao2021-02-28  39

排序函数(直接InsertSort,希尔ShellSort,选择SelectSort,快排QuickSort,堆排HeapSort,归并MergeSort)的实现(除基数排序),可以多点评论啊,有错火改

#include <iostream> using namespace std; typedef int Elm; struct node { Elm data;//数据域 int key;//标志符 }; //直接插入排序 void InsertSort(node *E,int n)//稳定的排序 时间复杂度O(n^2) { int i,j;node r; for(i=1;i<n;i++) { j=i-1;//保证 j 在要当前目标数值的前面 r=E[i]; while(j>=0&&E[j].key>r.key) { E[j+1]=E[j]; j--; } E[j+1]=r; } } //希尔排序 void ShellSort(node *E,int n) { int i,j,flag;node r; flag=n/2;//分两组 while(flag>0)//以细分为判定标准 { for(i=flag;i<n;i++) { r=E[i]; j=i-flag; while(j>=0&&r.key<E[j].key) { E[j+flag]=E[j]; j=j-flag; } E[j+flag]=r; } flag/=2; } } //冒泡排序_改良版 O(n^2) void BubbleSort(node *E,int n) { int i,j;node r; bool f=false;//标识符,用来标记,当没有交换的时候就是排序完成的时候 for(i=0;i<n-1;i++) { for(j=n-1;j>i;j--) { if(E[j].key<E[i-1].key) { r=E[j]; E[j]=E[j-1]; E[j-1]=r; f=true; } if(f==false) return ; } } } //快速排序 O(log_2n) void QuickSort(node *E ,int s,int t) { int i=s,j=t; node r; if(s<t) { r=E[s];//把这区间的第一元素给 r ,让 r 成为基准 while(i!=j) { while(j>i&&E[j].key>=r.key) j--;//从后面往前面遍历,直到找到比头 标准r 小的 E[i]=E[j]; while(i<j&&E[i].key<r.key) i++; //从前面往前面遍历,直到找到比头 标准r 大的 E[j]=E[i]; } E[i]=r; QuickSort(E,s,i-1);//对左区间递归排序 QuickSort(E,i+1,t); //对右区间递归排序 } } //选择排序 O(n^2) void SelectSort(node *E,int n) { int i,j,k; node temp; for (i=0;i<n-1;i++) //做第i趟排序 { k=i; for (j=i+1;j<n;j++) //在[i..n-1]中选key最小的R[k] if (E[j].key<E[k].key) k=j; //k记下的最小关键字所在的位置 if (k!=i) //交换R[i]和R[k] { temp=E[i]; E[i]=E[k]; E[k]=temp; } } } //堆排序 O(nlog_2n) 特别声明,数组开始从1开始,非0开始,否则代码实现会出错 void sift(node* E,int low,int high) //调整堆的算法 { int i=low,j=2*i; //E[j]是E[i]的左孩子 node temp=E[i]; while (j<=high) { if (j<high && E[j].key<E[j+1].key) j++;//比较两个孩子,标记数值大的下标 if (temp.key<E[j].key) { E[i]=E[j]; //将E[j]调整到双亲结点位置上 i=j; //修改i和j值,以便继续向下筛选 j=2*i; } else break; } E[i]=temp; } void HeapSort(node* E,int n) { int i; node temp; for (i=n/2;i>=1;i--) //循环建立初始堆 sift(E,i,n); for (i=n;i>=2;i--) //进行n-1次循环,完成推排序 { temp=E[1]; //将第一个元素同当前区间内E[1]对换 E[1]=E[i]; E[i]=temp; sift(E,1,i-1); //筛选E[1]结点,得到i-1个结点的堆 } } //归并排序 O(nlog_2n) void Merge(node *R,int low,int mid,int high) { node *R1; int i=low,j=mid+1,k=0; //k是R1的下标,i、j分别为第1、2段的下标 R1=new node[high-low+1]; while (i<=mid && j<=high) if (R[i].key<=R[j].key) //将第1段中的记录放入R1中 { R1[k]=R[i]; i++;k++; } else //将第2段中的记录放入R1中 { R1[k]=R[j]; j++;k++; } while (i<=mid) //将第1段余下部分复制到R1 { R1[k]=R[i]; i++;k++; } while (j<=high) //将第2段余下部分复制到R1 { R1[k]=R[j]; j++;k++; } for (k=0,i=low;i<=high;k++,i++) //将R1复制回R中 R[i]=R1[k]; delete []R1; } void MergePass(node *R,int length,int n) { int i; for (i=0;i+2*length-1<n;i=i+2*length) //归并length长的两相邻子表 Merge(R,i,i+length-1,i+2*length-1); if (i+length-1<n) //余下两个子表,后者长度小于length Merge(R,i,i+length-1,n-1); //归并这两个子表 } void MergeSort(node *R,int n) { int length; for (length=1;length<n;length=2*length) MergePass(R,length,n); }

转载请注明原文地址: https://www.6miu.com/read-76595.html

最新回复(0)