排序
快排:
void quickSort(vector<int>& arr, int left, int right)
{
if (left >= right) return ;
int p1 = left;
int p2 = right;
int pivot = arr[p1];
while (p1 < p2)
{
while (p1 < p2 && arr[p2] >= pivot) p2--;
arr[p1] = arr[p2];
while (p1 < p2 && arr[p1] <= pivot) p1++;
arr[p2] = arr[p1];
}
arr[p1] = pivot;
quickSort(arr, left, p1 - 1);
quickSort(arr, p1 + 1, right);
}
堆
定义:
typedef int HDdatatype;
typedef struct Head{
HDdatatype *a;
int size;
int capacity;
}HD;
堆所需函数:
- 向下调整堆
void Swap(int *px, int *py){
int temp = *px;
*px = *py;
*py = temp;
}
//小根堆
static void AdjustDown(HDdatatype a[], int size, int parent){
int child = parent * 2 + 1;//先假设左边的数比根数小
while (child <= size){//没有孩子结点退出
if (child + 1 <= size&&a[child] > a[child + 1]){//如果右边的数小,child++就得到右边数的下标
child++;
}
if (a[child] < a[parent]){//如果孩子结点比父节点小就就交换
Swap(&a[child], &a[parent]);
parent = child;
child = parent * 2 + 1;
}
else{//直到不大就退出
break;
}
}
}
- 建立堆
void HeadBuild(int a[],int num){
for (int i = ((num - 1 - 1) / 2); i >= 0; i--){
AdjustHead(a, num, i);
}
}