//3,插入排序voidinsertSort(int arr[],int len){for(int i =1; i < len; i++){//创建临时值存储要插入的元素int key = arr[i];int j = i -1;//在数组前部已排序的数据中找到大于要插入值的值//将插入值插入在该值之后while(j >=0&& key < arr[j]){
arr[j +1]= arr[j];
j--;}
arr[j +1]= key;}}
4,希尔排序
//4,希尔排序voidshellSort(int arr[],int len){//创建递减的增值序列,理论证明此增值为最高效的int h =1;while(h<len/3){
h =3* h +1;}//对每一个增值的所有待排序序列进行插入排序while(h >=1){//共有增值为h个的待排序序列,起始值索引分别为0~h-1,间隔为hfor(int i =0; i < h; i++){//对每一个间隔为h的序列进行插入排序for(int j = i+h; j <len; j += h){int tem = arr[j];int k = j - h;while(k >= i&&tem < arr[k]){
arr[k+h]= arr[k];
k -= h;}
arr[k+h]= tem;}}//将增值递减
h = h /3;}}
//7,堆排序voidheapAdjust(int arr[],int si,int ei){//调整堆结构,使之成为大顶堆//由父节点计算左节点int dad = si, son = dad *2+1;while(son<=ei){//选择最大子节点的索引,下一次父节点的调整方向为最大子节点处if(son +1<= ei && arr[son]< arr[son +1])
son++;//如果父节点已经大于子节点就直接返回if(arr[dad]> arr[son])return;else{//交换父子节点swap(arr[dad], arr[son]);
dad = son;
son = dad *2+1;}}}voidheapSort(int arr[],int len){//初始化堆,从最后一个父节点开始,即从下往上for(int i = len /2-1; i >=0; i--){heapAdjust(arr, i, len -1);}for(int i = len -1; i >0; i--){//将堆的最后一个元素与堆顶元素交换,即最大的元素依次放到了最后swap(arr[0], arr[i]);//重新调整堆结构heapAdjust(arr,0, i -1);}}
8,计数排序
//8,计数排序voidcountSort(int arr[],int len){//查找待排序数组的最大最小值int vmax = arr[0], vmin = arr[0];for(int i =1;i<len;i++){if(arr[i]> vmax)
vmax = arr[i];if(arr[i]< vmin)
vmin = arr[i];}// 创建差值大小的数组int d = vmax - vmin+1;int*tem =newint[d];for(int j =0; j < d; j++){
tem[j]=0;}for(int i =0;i<len;i++){
tem[arr[i]- vmin]++;}int k =0;for(int i =0; i < d; i++){for(int j =0;j<tem[i];j++){
arr[k++]= i + vmin;}}}