69,369
社区成员
发帖
与我相关
我的任务
分享
void sift(int e[]/*存储结点序列*/,
int n/*序列的结点个数*/,
int s/*对e[s]做渗透,其中e[s]的左右子树是堆*/)
{
int t,k,j;
t=e[s];
k=s;
j=2*k+1;/*e[k]是e[j]和e[j+1]的父结点*/
while(j<n)/*为渗透到页结点*/
{
if(j<n-1 && e[j]<e[j+1])//j<n-1??,e[j]<e[j+1]又是比较什么? 选出是左子还是右子跟父接点比较
j++; /*e[j+1]是e[k]较大的子结点*/
if(t<e[j])/*改连续渗透交换为循环传送*/
{// 交换每个父接点与子接点,满足大顶堆,同时继续比较子接点
e[k]=e[j];
k=j;
j=2*k+1;
printf("t:%d\n",t);
}
else
break;/*已是一个堆*/
}
e[k]=t;
}
void heapsort(int e[],int n)
{
int i,k,t;
for(i=n/2-1;i>=0;i--)// 从最后一个非叶子节点开始建堆
sift(e,n,i);/*建初始堆*/
for(k=n-1;k>=1;k--)
{
t=e[0];/*根结点与堆的末结点交换*/
e[0]=e[k];
e[k]=t;
printf("e[%d]:%d\n",k,t);
sift(e,k,0);/*重新建堆*/
}
}
void main()
{
int i,e[10]={93,35,29,45,48,82,76,17,11,33};
heapsort(e,10);
for(i=0;i<=9;i++)
printf("%4d",e[i]);
}
const int NUM=20;
int arr[] = {1,10,11,5,6,15,0,15,16,14,0,8,17,15,7,19,17,1,18,7};
/* swap函数:交换v[k]与v[j]的值 */
inline void swap(int v[], int k, int j)
{
int temp;
temp = v[k];
v[k] = v[j];
v[j] = temp;
}
void qsort(int v[], int left, int right)
{
int j, left_c,right_c,sigh;
left_c=left; //当前一趟快排的最左序号
right_c=right; //当前一趟快排的最右序号
sigh=0; //0表示从左边开始排
while(left_c!=right_c)
{
if(v[left_c]<v[right_c]) //搜索可以交换的位置
{
if(sigh==0)
--right_c;
else
++left_c;
continue;
}
if(sigh==0) //小头有空,交换
{
swap(v,left_c++,right_c);
sigh=1;
}
else //大头有空,交换
{
swap(v,left_c,right_c--);
sigh=0;
}
}
for(j=0;j<NUM;++j)
cout<<v[j]<<" ";
cout<<endl;
/*一次快排结束,小头和大头继续搜索*/
if(left<left_c-1)
qsort(v, left, left_c-1);
if(right>right_c+1)
qsort(v, right_c+1, right);
}
void main()
{
int j;
qsort(arr, 0, NUM-1);
for(j=0; j<NUM; j++)
printf("%d ", arr[j]);
printf("\n");
}
const int NUM=20;
int arr[] = {1,10,11,5,6,15,0,15,16,14,0,8,17,15,7,19,17,1,18,7};
void merge(int v[],int left,int mid,int right) //合并[left,mid]和[mid+1,right]
{
int i,j,k=0;
i=left; //i为第一路的下标
j=mid+1; //j为第二路的下标
int *temp=new int[right-left+1];
while(i<=mid&&j<=right)
temp[k++]=(v[i]<=v[j])?v[i++]:v[j++]; //依次合并2路到temp数组
while(i<=mid)
temp[k++]=v[i++];
while(j<=right)
temp[k++]=v[j++];
for(i=left,j=0;i<=right;++i,++j) //合并完数据写回v数组
v[i]=temp[j];
delete []temp;
}
void merge_sort(int v[],int num)
{
int i,size,j,mid,right;
for(i=1;i<num;i*=2) //log(n)趟归并
{
size=i-1;
j=0;
while(j<num)
{
mid=j+size;
right=j+2*size+1;
if(mid>=num) //下标不能溢出
mid=num-1;
if(right>=num)
right=num-1;
merge(v,j,mid,right);
j=right+1;
}
}
}
void main()
{
int j;
merge_sort(arr, NUM);
for(j=0; j<NUM; j++)
printf("%d ", arr[j]);
printf("\n");
}
void insert_swap(int *ele,int n)
{
int i,j,sem,var;
for(i=1;i<n;i++)
{
j=i;
sem=0;
while(sem==0)
{
if(*(ele+j)<*(ele+j-1))
{
var=*(ele+j);
*(ele+j)=*(ele+j-1);
*(ele+j-1)=var;
j--;
if(j==0)
{
sem++;
}
}
else if(*(ele+j)>=*(ele+j-1))
{
sem++;
// printf("no finding stop sem\n");
}
}
}
}
void main()
{
int i;
int element[10]={77,91,53,56,80,34,67,0,88,34};
insert_swap(element,10);
for(i=0;i<10;i++)
{
printf("element[%d] is %d\n",i+1,element[i]);
}
}