#include<iostream> using namespace std; void Insert(int r[],int n){ for(int i=2;i<=n;i++){ if(r[i]<r[i-1]){ r[0]=r[i]; int j=i-1; for(;r[0]<r[j];j--){ r[j+1]=r[j]; } r[j+1]=r[0];//游标指向j } } } void Shell(int r[],int n){ for(int d=n/2;d>=1;d/=2){ for(int i=d+1;i<=n;i++){ if(r[i]<r[i-d]){ r[0]=r[i]; int j=i-d; for(;r[0]<r[j]&&j>0;j-=d){ r[j+d]=r[j]; } r[j+d]=r[0]; } } } } void Bubble(int r[],int n){ int pos=n;//标志位 while(pos){ int bound=pos; pos=0; for(int j=1;j<bound;j++){ if(r[j]>r[j+1]){ r[0]=r[j]; r[j]=r[j+1]; r[j+1]=r[0]; pos=j; } } } } int Partion(int r[],int s,int e){ int i=s,j=e; r[0]=r[i]; while(i<j){ while((i<j)&&(r[j]>r[0])) j--; r[i]=r[j];//空位填补 while((i<j)&&(r[i]<r[0])) i++; r[j]=r[i]; } r[i]=r[0]; return i; } void Quick(int r[],int s,int e){ if(s<e){//递归退出的条件 int m=Partion(r,s,e); Quick(r,s,m); Quick(r,m+1,e);} } void Select(int r[],int n){ for(int i=1;i<n;i++){ int index=i; for(int j=i+1;j<=n;j++){ if(r[j]<r[index]){ index=j; } } if(index!=i){ r[0]=r[i]; r[i]=r[index]; r[index]=r[0]; } } } void Sift(int r[],int k,int m){ int i=k,j=2*i; while(j<=m){ if(j<m&&r[j+1]>r[j]) j++; if(r[i]>r[j]) break; else{ r[0]=r[i]; r[i]=r[j]; r[j]=r[0]; i=j; j=2*i; } } } void Heap(int r[],int n){ for(int i=n/2;i>=1;i--) Sift(r,i,n); for(int i=1;i<n;i++){ r[0]=r[1]; r[1]=r[n-i+1]; r[n-i+1]=r[0]; Sift(r,1,n-i); } } void main(){ int a[]={0,5,4,1,3,2}; //Insert(a,5); //Shell(a,5); //Bubble(a,5); //Quick(a,0,5); //Select(a,5); Heap(a,5); for(int i=1;i<=5;i++){ cout<<a[i]<<endl; } system("pause"); }
时间: 2024-10-03 21:54:14