下午就要考数据结构了呀有点慌....所以看看排序抱抱佛脚..于是...写了堆排序就停不下来了呢...
所以就把上课老师讲的排序都写了一遍..交题都过了可是复杂度可能会有些小问题..
//-------------------------堆排序------------------------//
//时间复杂度 平均 O(nlogn) 最坏 O(nlogn)
//空间复杂度 O(1)
#include <bits/stdc++.h>
using namespace std;
int a[1000006],n;
void PercDown(int a[],int i,int n) //O(logn)
{
if(2 * i + 1 >= n) return ;
else if(2 * i + 2 >= n){
if(a[i * 2 + 1] > a[i]) swap(a[i* 2 + 1] , a[i]);
}
else{
int p = i * 2 + 1,q = i * 2 + 2;
if(a[p] > a[q]) swap(p,q);
if(a[i] < a[q]){
swap(a[q],a[i]);
PercDown(a,q,n);
}
}
}
//(i + 1) * 2 (+ 1) - 1 = 2 * i + 1 || 2 * i + 2;
void HeapSort(int a[],int n)
{
for(int i = n/2;i >= 0;--i){ //建堆(大根堆)
PercDown(a,i,n);
}
for(int i = n-1;i >= 0;--i){ //更新大根堆
swap(a[0],a[i]);
PercDown(a,0,i);
}
}
//-------------------------快速排序------------------------//
//时间复杂度 平均 O(nlogn) 最坏 O(n^{2})
//空间复杂度 O(logn)
#include <bits/stdc++.h>
using namespace std;
int a[1000006];
void QuickSort(int a[],int l,int r)
{
int i,j,p;
p = a[l];
i = l,j = r;
while(i < j){
while(i < j && a[j] >= p){ //先移动右指针寻找大于哨兵的值
j--;
}
if(i != j){
a[i] = a[j];
}
else break;
while(i < j && a[i] <= p){ //后移动左指针寻找小于哨兵的值
i++;
}
if(i != j){
a[j] = a[i];
}
else break;
}
a[j] = p; //指针相碰,指针位置就是哨兵的最终位置
if(l < j) QuickSort(a,l,j);
if(j+1 < r)QuickSort(a,j+1,r);
}
//-----------------------直接插入排序----------------------//
//时间复杂度 平均 O(n^{2}) 最坏 O(n^{2})
//空间复杂度 O(1)
#include <bits/stdc++.h>
using namespace std;
int a[1000006];
void InsertSort(int a[],int n)
{
for(int i = 1;i < n;++i){
int p = a[i];
for(int j = i;j >= 0;--j){
if(a[j-1] > p) a[j] = a[j-1];
else{
a[j] = p;
break;
}
}
}
}
//-------------------------希尔排序------------------------//
//时间复杂度 平均 O(nlogn) 最坏 O(n^{2})
//空间复杂度 O(1)
#include <bits/stdc++.h>
using namespace std;
int a[1000006];
void ShellSort(int a[],int n)
{
for(int d = n/2;d > 0;d/=2){ //以n/2为增量序列
for(int p = d;p < n;++p){
int tmp = a[p];
int i = p;
for(i = p;i >= d && a[i-d] > tmp; i-=d)
a[i] = a[i-d];
a[i] = tmp;
}
}
}

京公网安备 11010502036488号