void selectSort(int array[], int len)
{
for (int i = 0; i < len; i++)
{
int min = i;
for (int j = i+1; j < len; j++)
{
if (array[j] < array[min])
{
min = j;
}
}
if (min != i)
{
int tmp = array[i];
array[i] = array[min];
array[min] = tmp;
}
}
}
//第一:堆排序首先要建立一个大顶堆或者小顶堆(通过调整非叶子节点,从左至右,从下到上);第二,使根节点与末尾节点交换,把最大或最小元素放到末尾。
//调整堆
void heapify(int array[], int start, int end)
{
int parent = start;
int child = parent*2+1;
while(child <= end)
{
if (child + 1 <= end && array[child] < array[child+1])
{
child++;
}
if (array[parent] > array[child])
{
return;
}
else
{
int tmp = array[parent];
array[parent] = array[child];
array[child] = tmp;
parent = child;
child = parent*2+1;
}
}
}
void headSort(int array[], int len)
{
//构造堆
for (int i = len/2 - 1; i >= 0; i--)
{
heapify(array, i, len-1);
}
//堆顶元素下放
for (int j = len-1; j >= 0; j--)
{
int tmp = array[j];
array[j] = array[0];
arrayp[0] = tmp;
heapify(array, 0, j-1);
}
}
int main(int argv, char* argc[])
{
int array[] = {1,34,2,8,0,3,4,67,11};
headSort(array, sizeof(array)/sizeof(int));
for(int i = 0; i < sizeof(array)/sizeof(int); i++ )
{
printf("%d,", array[i]);
}
printf("\n");
return 0;
}
初始:
从8开始调整,8与67进行交换
再调整2元素,2与4进行交换
再调整34元素,34与67进行交换,34还需要与子节点进行比较交换
再调整1元素,1与67交换,1与34交换,1与11交换
得到大顶堆:
再调整堆:
67元素与1交换。再调整堆
堆顶元素继续下沉:
最终结果: