排序
1.选择排序
0-n-1选择最小的放到a[0];
1-n-1选择最小的放到a[1];
.......
2.插入排序
第一个有序,第二个跟其比较,小的话交换;
第三个跟第二个比较,小的话交换,再跟前一个比较。
3.sort函数
sort(a,a+N,cmp)
4.堆排序
4.1 堆定义:
const int maxn=100;
int heap[maxn],n=10;
4.2 向下调整:
跟下一层比较,做调整。
void downAdjust(int low,int high)
{
int i=low,j=i*2;
while(j<=high)
{
if(j+1<=high&&heap[j+1]>heap[j])
{
j=j+1;
}
if(heap[j]>heap[i])
{
swap(heap[i],heap[j]);
i=j;
j=i*2;
}else
{
break;
}
}
}
4.3 建堆
从倒数第二层开始,由下至上,使得全局调整。
void createHeap()
{
for(int i=n/2;i>=1;i--)
{
downAdjust(i,n);
}
}
4.4 删除堆顶元素(即最大数)
void deleteTop()
{
heap[1]=heap[n--];//把最小的数取代最大的数,并且使得元素个数减一;
downAdjust(1,n);//做一次向下调整;
}
删除其他的元素也一样
heap[x]=heap[n--];
downAdjust(x,n);
4.5 添加一个元素
4.5.1 向上调整:
void upAdjust(int low,int high)
{
int i=high,j=high/2;
while(j>=low)
{
if(heap[j]<heap[i])
{
swap(heap[i],heap[j]);
i=j;
j=i/2;
}else
{
break;
}
}
}
4.5.2 添加元素
void insert(int x)
{
heap[++n]=x;//元素个数加一末位赋值
upAdjust(1,n);//向上调整
}
4.6 堆排序
把最大的数(第一个)跟最后一个交换,最大值放在了最后,1-n-1进行调整;
void heapsort()
{
createHeap();
for(int i=n;i>1;i--)
{
swap(heap[i],heap[1]);
downAdjust(1,i-1);
}
}
5.归并排序
简单方法:
void mergeSort(int A[])
{
for(int step=2;step/2<=n;step*=2)//因为step<=n的话,可能没有经历全局排序(如step=8,全局n=10)
{
for(int i=1;i<=n;i+=step)
{
sort(A+i,A+min(i+step,n+1));//以防step太大
}
//一次排序完成。
}
}
6.快速排序
void quicksort(int A[],int left,int right)
{
if(left<right)//边界条件
{
int temp=A[left];//left处挖空
int i=left,j=right;
while(i<j)
{
while(i<j&&A[j]>temp)
{
j--;
}
A[i]=A[j];
while(i<j&&A[i]<=temp)
{
i++;
}
A[j]=A[i];
}
A[i]=temp;
quicksort(A,left,i-1);
quicksort(A,i+1,right);
}
}

浙公网安备 33010602011771号