算法读书笔记第2章-2
继续介绍排序---希尔排序, 归并排序, 快速排序, 堆排序
(1)希尔排序:也是一种插入排序,但是时间效率有所提高,是因为权衡了子数组的规模和有效性
①基本思想:先将整个待排序的分割成若干个子序列(具有一定的增量)分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。实质就是分组插排
④额外空间复杂度:O(1)
⑤不稳定
(2)归并排序
①基本思想:类似于一棵树,不断的划分,直到划分到一个数,不可再划分停止,之后开始向上递归合并
②核心代码:
④额外空间复杂度:O(n),需要生成一个help数组
⑤稳定
(3)快速排序
①基本思想:选定一个元素作为标准,之后划分大于,小于,等于这个数的三个区域,之后递归即可
②核心代码:
④额外空间复杂度:O(logn),记录树的断点
⑤不稳定
(3)堆排序
①基本思想:建立大根堆,就是优先队列,之后剪枝,调堆
②核心代码:
④额外空间复杂度:O(1),原地调序
⑤不稳定
#笔记##读书笔记#
(1)希尔排序:也是一种插入排序,但是时间效率有所提高,是因为权衡了子数组的规模和有效性
①基本思想:先将整个待排序的分割成若干个子序列(具有一定的增量)分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。实质就是分组插排
②核心代码:
void ShellSort(int a[], int n)
{
int h = 1;
while(h < n/3){
h = 3*h + 1;
}
while(h > 0){
for(int i = h; i < n; ++i){
for(int j = i; j >= h; j-=h){
if(a[j] < a[j-h])
swap(a[j],a[j-h]);
}
}
h = h/3;
}
}
③时间复杂度:O(N3/2)~O(N7/6)④额外空间复杂度:O(1)
⑤不稳定
(2)归并排序
①基本思想:类似于一棵树,不断的划分,直到划分到一个数,不可再划分停止,之后开始向上递归合并
②核心代码:
void Merge(int a[], int l, int mid, int r)
{
int i = 0;
int p1= l;
int p2 = mid+1;
int help[maxn];
while(p1<=mid && p2 <= r)
{
help[i++] = a[p1] < a[p2] ? a[p1++] : a[p2++];
}
while(p1 <= mid)
{
help[i++] = a[p1++];
}
while(p2 <= r)
{
help[i++] = a[p2++];
}
int k = 0;
for(int i = l; i <= r; ++i)
{
a[i] = help[k++];
}
}
void MergeSort(int a[],int l,int r)
{
if(l == r)
return ;
int mid = l + (r-l)/2;
MergeSort(a,l,mid);
MergeSort(a,mid+1,r);
Merge(a,l,mid,r);
} ③时间复杂度:O(n*logn)④额外空间复杂度:O(n),需要生成一个help数组
⑤稳定
(3)快速排序
①基本思想:选定一个元素作为标准,之后划分大于,小于,等于这个数的三个区域,之后递归即可
②核心代码:
vector<int> Partition(int a[], int l, int r)
{
vector<int> ans;
int less = l-1;
int more = r;
int pos = l;
while(pos < r)
{
if(a[pos] < a[r])
swap(a[++less],a[pos++]);
else if(a[pos] > a[r])
swap(a[--more],a[pos]);
else
pos++;
}
swap(a[more],a[r]);
ans.push_back(less+1);
ans.push_back(more);
return ans;
}
void QuickSort(int a[], int l, int r)
{
if(l < r)
{
int pos =l+rand()%(r-l+1);
swap(a[pos],a[r]);
vector<int> p = Partition(a,l,r);
QuickSort(a,l,p[0]-1);
QuickSort(a,p[1]+1,r);
}
}
③时间复杂度:O(n*logn)④额外空间复杂度:O(logn),记录树的断点
⑤不稳定
(3)堆排序
①基本思想:建立大根堆,就是优先队列,之后剪枝,调堆
②核心代码:
void HeapInsert(int a[], int index){
while(a[index] > a[(index-1)/2])
{
swap(a[index],a[(index-1)/2]);
index = (index-1)/2;
}
}
void Heapify(int a[], int index, int size){
int left = index*2 + 1;
while(left < size)
{
int largest = left+1 < size && a[left+1] > a[left] ? left+1 : left;
largest = a[largest] > a[index] ? largest : index;
if(largest == index) break;
swap(a[largest],a[index]);
index = largest;
left = index*2 + 1;
}
}
void HeapSort(int a[],int n){
for(int i = 0; i < n; ++i)
{
HeapInsert(a,i);
}
int size = n;
swap(a[0],a[--size]);
while(size > 0)
{
Heapify(a,0,size);
swap(a[0],a[--size]);
}
}
③时间复杂度:O(n*logn)④额外空间复杂度:O(1),原地调序
⑤不稳定
