您的位置:首页 > 其它

堆排序算法实现

2017-04-07 22:20 169 查看
思路:先将数组以大根堆形式存取,然后每次将首尾元素替换时,将堆长度减1,最后就是从小到大排列

代码如下:

class Solution
{
public:
void heapSort(int nums[], int n)
{
for (int i = n / 2; i >= 0; i--)
{
siftUp(i, nums, n);
}

int len = n;
for (int i = 0; i < n; i++)
{
swap(nums[0], nums[len - 1]);
len--;
siftUp(0, nums, len);
}

}

private:
void siftUp(int cur, int nums[], int n)
{
while (cur < n)
{
int left = 2 * cur + 1, right = 2 * cur + 2;
if (left >= n) break;

int child = left;
int max_value = nums[child];
if (right < n && nums[child] < nums[right])
{
child = right;
max_value = nums[right];
}

if (nums[cur] >= max_value) break;

swap(nums[cur], nums[child]);
cur = child;
}
}
};


测试如下:

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>

using namespace std;

int main()
{
int nums[] = {4, 3, 1, 2, 5};
Solution solution;
int len = sizeof(nums) / sizeof(int);
solution.heapSort(nums, len);

copy(nums, nums + len, ostream_iterator<int>(cout, " "));
return 0;
}


js实现:

var heapSort = {
sort:function(nums)
{
var len = nums.length;
for (var i = len / 2; i >= 0; i--)
{
this.siftUp(i, nums, len);
}

var n = len;
for (var i = 0; i < len; i++)
{
var tmp = nums[0];
nums[0] = nums[n - 1];
nums[n - 1] = tmp;

n--;
this.siftUp(0, nums, n);
}
},

siftUp:function(cur, nums, n)
{
while (cur < n)
{
var left = 2 * cur + 1, right = 2 *  cur + 2;
if (left >= n) break;

var child = left;
var max_value = nums[child];

if (right < n && nums[right] > max_value)
{
max_value = nums[right];
child = right;
}

if (nums[cur] >= max_value) break;

var tmp = nums[cur];
nums[cur] = nums[child];
nums[child] = tmp;
}
}
};

var nums = [3, 4, 5, 1];
heapSort.sort(nums);
console.log(nums);

第二种实现形式,是将当前结点元素与子元素比较,将当前元素移动到合适的位置

代码如下:

class Solution
{
public:
void heapSort(int nums[], int n)
{
for (int i = n / 2; i >= 0; i--)
{
siftUp(i, nums, n);
}

int len = n;
for (int i = 0; i < n; i++)
{
int tmp = nums[0]; nums[0] = nums[len - 1]; nums[len - 1] = tmp;
len--;
siftUp(0, nums, len);
}

}

private:
void siftUp(int cur, int nums[], int n)
{
int child = 2 * cur + 1;
int elem = nums[cur];
while (child < n)
{
if (child + 1 < n && nums[child] < nums[child + 1]) child++;

if (elem >= nums[child]) break;

nums[cur] = nums[child];
cur = child;
child = 2 * cur + 1;
}

nums[cur] = elem;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: