//直接插入voidinsertsort(int a[],int n){int i, j, temp;for(i =1; i < n; i++){
temp = a[i];//保留元素for(j = i -1; j >=0&& a[j]> temp; j--){
a[j +1]= a[j];//后移,>是为了稳定性}
a[j +1]= temp;}}
//折半插入//记住结束时的位置关系voidinsertsort2(int a[],int n){int i, j, temp;int low, high, mid;for(i =1; i < n; i++){
temp = a[i];//无哨兵
low =0, high = i -1;//查找范围while(low <= high){
mid =(low + high)/2;if(a[mid]> temp)//稳定性
high = mid -1;else
low = mid +1;}for(j = i-1; j >= high +1; j--)//从i-1往后挪
a[j +1]= a[j];
a[high +1]= temp;}}
//大堆顶排序//a[0]空出来,辅助空间int a[10]={NULL,10,3,6,23,44,56,99,1,21};voidHeadAdjust(int a[],int k,int len);voidbuildMAXHeap(int a[],int len);voidswap(int& a,int& b);voidHeadsort(int a[],int len);//建立大根堆voidbuildMAXHeap(int a[],int len){//从最后一个非叶结点开始for(int i = len /2; i >=1; i--){HeadAdjust(a, i, len);}}//调整以k为跟的子树voidHeadAdjust(int a[],int k,int len){
a[0]= a[k];//保存根节点for(int i =2* k; i <= len; i =2* i){//左孩子为2iif(i < len && a[i]< a[i +1])//找到大孩子下标
i++;if(a[0]>= a[i])break;//还是原来的根节点大else{
a[k]= a[i];//a[i] = a[0];有break的情况,不能这么写
k = i;}
a[k]= a[0];}//a[k] = a[0];????}voidswap(int& a,int& b){int c = a;
a = b;
b = c;}voidHeadsort(int a[],int len){buildMAXHeap(a, len);for(int i = len; i >1; i--){swap(a[1], a[i]);HeadAdjust(a,1, i -1);}}intmain(){buildMAXHeap(a,9);for(int i =1; i <10; i++)
cout << a[i]<<" ";
cout << endl;//int x = 20, y = 30;//swap(x, y);//cout << x << endl;Headsort(a,9);//这里传入的数是数组实际有多少个数字for(int i =1; i <10; i++)
cout << a[i]<<" ";return0;}