目录
希尔排序
void ShellSort(int A[],int n)
{
int d,i,j;
for(d=n/2;d>=1;d=d/2) //步长变化
for(i=d+1;i<=n;++i)
if(A[i]<A[i-d]) //若A[i]<A[i-d]证明其需跟前面元素对调
{
A[0]=A[i]; //A[0]为暂存单元
for(j=i-d;j>0&&A[0]<A[j];j-=d)
A[j+d]=A[j]; //记录后移,查找插入位置
A[j+d]=A[0]; //插入
}
}
冒泡排序
void BubbleSort(int R[],int n)
{
int i,j,flag,temp;
for(i=n-1;i>=1;--i)
{
flag=0;
for(j=1;j<=i;++j)
if(R[j-1]>R[j])
{
temp=R[j];
R[j]=R[j-1];
R[j-1]=temp;
flag=1;
}
if(flag==0)
return;
}
}
快速排序
void QuickSort(int R[],int low,int high)
{
int temp;
int i=low,j=high;
if(low<high)
{
temp=R[low];
while(i<j)
{
while(j>i&&R[j]>=temp) //从后往前扫描,找到一个小于temp的关键字
j--;
if(i<j)
R[i++]=R[j]; //交换
while(i<j&&R[i]<=temp) //从前往后扫描,找到一个大于temp的关键字
i++;
if(i<j)
R[j--]=R[i]; //交换
}
R[i]=temp; //将temp放在最终位置
QuickSort (R,low,i-1); //递归对temp左边进行排序
QuickSort (R,i+1,high); //递归对temp右边进行排序
}
}
堆排序
(以小顶堆为例)
建堆时间复杂度O(n);向下调整时间复杂度O(h),h为数高;堆的插入和删除元素的复杂度也为O(h);堆排序时间复杂度为O(nlog2n)
堆的插入
void HeapInsert(int *heap, int n, int num) {
int i, j;
heap[n+1] = num;//num插入堆尾
i = n+1;
j = (n+1) / 2;//j指向i的父结点
while (j > 0) {
if (heap[j] <= num)
break;
heap[i] = heap[j];
i = j;
j = i / 2;
}
heap[i] = num;
return;
}
堆的删除
void HeapDelete(int *heap, int n){
heap[1] = heap[n]; //使用堆尾元素直接覆盖堆顶元素。
HeapAdjust(heap,1,n-1); //从堆顶到堆尾(此时堆中只有n-1个元素)进行堆调整。
return 0;
}
堆的调整
void HeapAdjust(int *heap, int top, int n) {
int j = 2 * top; //左孩子结点
int temp = heap[top];
while (j <= n){
if (j + 1 <= n&&heap[j + 1] < heap[j])
j++; //使j指向左右孩子中较小的结点。
if (heap[j] >= temp)
break;
heap[top] = heap[j];
top = j;
j = 2 * top;
}
heap[top] = temp;
return;
}
建堆
void CreatHeap(int *heap, int n){
int i;
for (i = n/2; i > 0; i--){
HeapAdjust(heap, i, n);
}
return;
}
堆排序
void HeapSort(int *heap, int n){
CreateHeap(heap,n);
int i;
int temp;
for (i = n; i > 1; i--){
temp=heap[1];
heap[1]=heap[i];
heap[i]=temp;
HeapAdjust(heap,1,i-1);
}
return;
}