您的位置:首页 > 编程语言 > C语言/C++

来自菜鸟的日程-------c语言基础篇18(排序2----快排,堆排)

2018-11-18 22:17 405 查看

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<assert.h>

//堆排:

void Adjust(int *arr,int start,int end)
{
int tmp = arr[start];
for(int i=2*start+1;i <= end;i = 2*i+1)
{
// 判断是否有右孩子
if (i < end && arr[i] <arr[i+1])
{
i++;
}//i为当前孩子的最大下标
if(arr[i] > tmp)
{
arr[start] = arr[i];
start = i;
}
else
{
break;
}
}
arr[start] = tmp;
}
void HeapSort(int *arr,int len)
{
int i = 0;
for(i = (len-1-1)/2;i >= 0;i--)
{
Adjust(arr,i,len-1);
}
//肯定是大根堆
//先交换,后调整(只需要调整0号下标这棵树)
for(i = 0;i < len-1;i++)
{
int tmp = arr[0];
arr[0] = arr[len-1-i];
arr[len-1-i] = tmp;
Adjust(arr,0,len-1-i-1);
}
}

快速排序:找基准的过程(递归)
每次可以均匀的分割待排序序列,快速排序会越来越快
三种排序方式:
1、固定位置选取基准法
2、随机选取基准法
3、三分取中法
两种优化:
1、如果待排序序列,在排序过程当中数据量变得很小时,用直接插入排序
2、聚集相同基准法

/*
时间复杂度:O(nlog2n)
空间复杂度:O(log2n)
不稳定
*/

//快排:

int Partion(int *arr,int low,int high)
{
int tmp = arr[low];
while(low < high)
{
while(low < high && arr[high] > tmp)
{
high --;
}
if(low >= high)
{
break;
}
else
{
arr[low] = arr[high];
}
while(low < high && arr[low] < tmp)
{
low ++;
}
if(low >= high)
{
break;
}
else
{
arr[high] = arr[low];
}
}
arr[low] = tmp;
return low;
}

//递归版:

void Quick(int *arr,int start,int end)
{
int par = Partion(arr,start,end);//O(n)
//左边
if(par > start + 1)
{
Quick(arr,start,par - 1);//log(2n)
}
//右边
if(par < end - 1)
{
Quick(arr,par + 1,end);
}
}

void QuickSort(int *arr,int len)
{
Quick(arr,0,len-1);
}

//非递归:

void QuickSort1(int *arr,int len)
{
//log2n
int tmpSize = (int)log((double)len)/log((double)2);
int  *stack = (int*)malloc(sizeof(int)*tmpSize*2);
assert(stack != NULL);
int top = 0;// 数组的下标
int low = 0;
int high = len-1;
int par = Partion(arr,low,high);//第一次找完基准
if(par > low+1)
{
stack[top++] = low;
stack[top++] = par-1;
}
if(par < high-1)
{
stack[top++] = par+1;
stack[top++] = high;
}
while(top > 0)
{
high = stack[--top];
low = stack[--top];
par = Partion(arr,low,high);

if(par > low+1)
{
stack[top++] = low;
stack[top++] = par-1;
}
if(par < high-1)
{
stack[top++] = par+1;
stack[top++] = high;
}
}
free(stack);
stack = NULL;
}

void Show(int *arr,int len)
{
for(int i = 0;i  < len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[] = {12,5,9,0,7,4,22,21,55,77,11};
int len = sizeof(arr) / sizeof(arr[0]);
QuickSort(arr,len);//递归
//QuickSort1(arr,len);//非递归
//HeapSort(arr,len);//堆排
Show(arr,len);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: