各种排序
堆排序在最后…
#include <bits/stdc++.h>
using namespace std;
int a[105];
void quick_sort(int l, int r)
{
if(l>=r)
return ;
int i = l;
int j = r;
int tmp = a[l];
while(i<j)
{
while(a[j]>tmp&&i<j)
j--;
while(a[i]<=tmp&&i<j)
i++;
if(i<j)
swap(a[i],a[j]);
}
swap(a[i],a[l]);
quick_sort(l,i-1);
quick_sort(i+1,r);
}
void bubble_sort(int n)
{
int flag = n;
while(flag)
{
int k = flag;
flag = 0;
for(int i=1; i<k; i++)
{
if(a[i-1]>a[i])
{
swap(a[i-1],a[i]);
flag = i;
}
}
}
return ;
}
void insert_sort(int n)
{
for(int i=1; i<n; i++)
{
int tmp = a[i];
for(int j=i-1; j>=0&&a[j]>tmp; j--)
{
swap(a[j+1],a[j]);
}
}
return ;
}
void shell_sort(int n)
{
for(int gap=n/2; gap>0; gap/=2)
{
for(int i=gap; i<n; i++)
{
for(int j=i-gap; j>=0&&a[j]>a[j+gap]; j-=gap)
{
swap(a[j],a[j+gap]);
}
}
}
return ;
}
void select_sort(int n)
{
for(int i=0; i<n; i++)
{
int pos = i;
for(int j=i+1; j<n; j++)
{
if(a[j]<a[pos])
pos = j;
}
swap(a[i],a[pos]);
}
}
void merge_list(int l, int r, int l2, int r2, int tmp[])
{
int i = l;
int j = l2;
int k = 0;
while(i<=r&&j<=r2)
{
if(a[i]<a[j])
{
tmp[k++] = a[i];
i++;
}
else
{
tmp[k++] = a[j];
j++;
}
}
while(i<=r)
tmp[k++] = a[i++];
while(j<=r2)
tmp[k++] = a[j++];
for(int i=0; i<k; i++)
{
a[l+i] = tmp[i];
}
}
void merge_sort(int l, int r, int tmp[])
{
if(l<r)
{
int mid = (l+r)>>1;
merge_sort(l,mid,tmp);
merge_sort(mid+1,r,tmp);
merge_list(l,mid,mid+1,r,tmp);
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
// quick_sort(0,n-1);
// bouten_sort(n);
// insert_sort(n);
// shell_sort(n);
// select_sort(n);
int* tmp = new int[n];
merge_sort(0,n-1,tmp);
delete[] tmp;
for(int i=0; i<n; i++)
printf("%d\n",a[i]);
}
}
#include <bits/stdc++.h>
using namespace std;
int a[105];
int b[105];
/**
整理思路(以最小堆为例)
堆是二叉树的一种,可以用数组实现
要实现的操作:建堆,删除堆顶,堆排序
建堆:每次利用插入操作向现有堆中插入一个元素,然后通过堆的自底向上调整维护最小堆
删除堆顶:删除堆顶后为保持最小堆特性,利用堆的自顶向下调整
堆排序:堆排序就可以利用不停的取出堆顶即可
*/
///堆的自底向上调整,类似插入排序,将一个数据插入到有序数据中
///悄悄地说...插入排序我也写了博客...可以一看
void fix_up(int id)
{
for(int j=(id-1)>>1; j>=0&&a[j]>a[id]; id=j,j=(id-1)>>1)
{
swap(a[id],a[j]);
}
}
///插入操作,即向数组末尾添加数据,然后进行调整
void insert_val(int id, int val)
{
printf("%d %d\n",id,val);
a[id] = val;
fix_up(id);
}
/**
堆的自顶向下调整
从根结点开始进行一次从上向下的调整。
调整时先在左右儿子结点中找最小的,
如果父结点比这个最小的子结点还小说明不需要调整了,
反之将父结点和它交换后再考虑后面的结点。
相当于从根结点将一个数据的“下沉”过程。
*/
void fix_down(int i, int n)
{
int j,tmp;
tmp = a[i];
j = 2 * i + 1;
while(j<n)
{
if(j+1<n&&a[j+1]<a[j])
j++;
if(a[j]>tmp)
break;
a[i] = a[j];
i = j;
j = 2 * i + 1;
}
a[i] = tmp;
}
/**
删除0号节点,我们可以这样操作,
将最后一个数据的值赋给根结点,
然后进行一次自顶向下的调整
*/
void delete_node(int id, int n)
{
swap(a[0],a[n-1]);
fix_down(0,n-1);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int id = 0;
int minn = 0x3f3f3f3f;
for(int i=0; i<n; i++)
{
scanf("%d",&b[i]);
if(b[i]<minn)
{
minn = b[i];
id = i;
}
}
//建堆
a[0] = minn;
int j = 1;
for(int i=0; i<n; i++)
{
if(i!=id)
insert_val(j++,b[i]);
}
for(int i=0; i<n; i++)
printf("%d\n",a[i]);
for (int i = n - 1; i >= 1; i--)
{
swap(a[i], a[0]);
fix_down(0, i);
}
for(int i=0; i<n; i++)
printf("%d...\n",a[i]);
}
}