#include<iostream>
using namespace std;
//直接插入排序
void Insert(int *arr, int len)
{
for(int i=0;i<len-1;++i)
{
if(arr[i+1]<arr[i])
{
int k=i;
int tep = arr[i+1];
while(arr[k]>tep && k>=0)
{
arr[k+1] = arr[k];
k--;
}
arr[k+1] =tep;
}
}
}
void show(int *arr, int len)
{
for(int i=0;i<len;++i)
{
cout<<arr[i]<<' ';
}
cout<<endl;
}
//希尔排序
void Shell(int *arr , int len, int d)
{
for(int i=d;i<len;i++)
{
if(arr[i]<arr[i-d])
{
int tep= arr[i];
arr[i] = arr[i-d];
arr[i-d] = tep;
}
}
}
//冒泡排序
void Pop(int *arr , int len)
{
if(arr==NULL)
{
return ;
}
for(int j=1;j<len;j++)
{
int flg=0;
for(int i=0;i<len-1;++i)
{
if(arr[i]>arr[i+1])
{
int tep = arr[i];
arr[i] = arr[i+1];
arr[i+1] = tep;
flg=1;
}
}
if(flg==0)
{
break;
}
}
}
//双向冒泡排序
void Doupop(int *arr , int len)
{
if(arr == NULL)
{
return;
}
int swap=1;
for(int i=1; swap!=0; ++i)
{
swap=0;
for(int j=i;j<len;++j)
{
if(arr[j-1]>arr[j])
{
int tep = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tep;
swap=1;
}
}
for(int j=len-i; j>=0; j--)
{
if(arr[j]<arr[j-1])
{
int tep = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tep;
}
}
}
}
//快速排序
int Partion(int *arr , int beg, int end)
{
int tep = arr[beg];
while(beg<end)
{
while(beg<end && arr[end]>=tep)
{
end--;
}
if(beg<end)
{
arr[beg] = arr[end];
beg++;
}
while(beg<end&& arr[beg]<=tep)
{
beg++;
}
if(beg<end)
{
arr[end] = arr[beg];
end--;
}
}
arr[beg] = tep;
return beg;
}
void QuitSort(int *arr , int beg, int end)
{
if(arr==NULL)
{
return ;
}
int i;
if(beg<end)
{
i = Partion(arr , beg, end);
QuitSort(arr , beg , i-1);
QuitSort(arr , i+1,end);
}
}
//直接选择排序
void SelectSort(int *arr , int n)
{
int min;
int k;
for(int i=0;i<n-1;++i)
{
min = arr[i];
for(int j=i+1;j<n;++j)
{
if(arr[j]<min)
{
min = arr[j];
k=j;
}
}
if(k!=i)
{
int tep = arr[i];
arr[i] = arr[k];
arr[k] = tep;
}
}
}
//堆排序学习的是海子老师的算法;
void HeapAdjust(int *a,int i,int size) //调整堆
{
int lchild=2*i; //i的左孩子节点序号
int rchild=2*i+1; //i的右孩子节点序号
int max=i; //临时变量
if(i<=size/2) //如果i是叶节点就不用进行调整
{
if(lchild<=size&&a[lchild]>a[max])
{
max=lchild;
}
if(rchild<=size && a[rchild]>a[max])
{
max=rchild;
}
if(max!=i )
{
swap(a[i],a[max]);
if(max<size/2)
{
HeapAdjust(a,max,size); //避免调整之后以max为父节点的子树不是堆
}
}
}
}
void BuildHeap(int *a,int size) //建立堆
{
int i;
for(i=size/2;i>0;i--) //非叶节点最大序号值为size/2
{
HeapAdjust(a,i,size);
}
}
void HeapSort(int *a,int size) //堆排序
{
int i;
BuildHeap(a,size);
for(i=size;i>=1;i--)
{
//cout<<a[1]<<" ";
swap(a[1],a[i]); //交换堆顶和最后一个元素,即每次将剩余元素中的最大者放到最后面
//BuildHeap(a,i-1); //将余下元素重新建立为大顶堆
HeapAdjust(a,1,i-1); //重新调整堆顶节点成为大顶堆
}
}
int main()
{
int arr[] = {-1,9,8,7,6,5,4,3,2,1,0};
int len = sizeof(arr)/sizeof(arr[0]);
/*cout<<len<<endl;
Insert(arr , len);
show(arr,len);
cout<<endl;
for(int i=4;i>=0;i--)
{
Shell(arr, len , i);
}
show(arr, len);
Pop(arr , len);
Doupop(arr , len);
QuitSort(arr , 0, len-1);
SelectSort(arr , len);*/
HeapSort(arr , len-1);
show(arr, len);
return 0;
}
各种排序
最新推荐文章于 2022-06-11 20:07:53 发布