堆排序(包含最大堆和最小堆)
堆排序 时间复杂度nlgn,原址排序。
通用函数
int parent(int i)
{return (i - 1) >> 1;
}
int left(int i)
{return (i << 1) + 1;
}
int right(int i)
{return (i << 1) + 2;
}
最大堆排序
void max_heapify(int *array,int heap_size,int parent_index)
{int l = left(parent_index);int r = right(parent_index);int largest = parent_index;if(l < heap_size && array[l] > array[parent_index])largest = l;if(r < heap_size && array[r] > array[largest])largest = r;if(largest != parent_index){int temp = array[largest];array[largest] = array[parent_index];array[parent_index] = temp;max_heapify(array,heap_size,largest);}
}
void build_heap(int *array,int length)
{for (int i = length/2; i >= 0 ; i--) {max_heapify(array,length,i);}
}
void heap_sort(int *array,int length)
{build_heap(array,length);for (int i = length - 1; i > 0 ; i--) {int temp = array[i];array[i] = array[0];array[0] = temp;max_heapify(array,i,0);}
}
最小堆排序
void min_heapify(int *array,int heap_size,int parent_index)
{int l = left(parent_index);int r = right(parent_index);int smallest = parent_index;if(l < heap_size && array[l] < array[smallest])smallest = l;if(r < heap_size && array[r] < array[smallest]){smallest = r;}if(smallest != parent_index){int temp = array[smallest];array[smallest] = array[parent_index];array[parent_index] = temp;min_heapify(array,heap_size,smallest);}
}
void build_min_heap(int *array,int length)
{for (int i = length/2; i >= 0 ; i--) {min_heapify(array,length,i);}
}
void min_heap_sort(int *array,int length)
{build_min_heap(array,length);for (int i = length - 1; i > 0 ; i--) {int temp = array[i];array[i] = array[0];array[0] = temp;min_heapify(array,i,0);}
}