Skip to content

Commit a856184

Browse files
author
kevin-y-ma
committedSep 15, 2019
0915
1 parent be2e92f commit a856184

File tree

3 files changed

+133
-4
lines changed

3 files changed

+133
-4
lines changed
 

‎leetcode/215-findKthLargest.cpp

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// 方法一
2+
class Solution {
3+
void adjust(vector<int> & nums, int start, int end)
4+
{
5+
int dad = start;
6+
int son = dad * 2 + 1;
7+
while (son<=end) {
8+
if ((son+1) <= end && nums[son]<nums[son+1])
9+
son += 1;
10+
if (nums[dad] < nums[son]) {
11+
swap(nums[dad], nums[son]);
12+
dad = son;
13+
son = dad*2+1;
14+
} else {
15+
return ;
16+
}
17+
}
18+
}
19+
20+
void heapify(vector<int> & nums)
21+
{
22+
int len = nums.size();
23+
for (int i=len/2-1; i>=0; i--) {
24+
adjust(nums, i, len-1);
25+
}
26+
27+
}
28+
public:
29+
int findKthLargest(vector<int>& nums, int k) {
30+
int len = nums.size();
31+
heapify(nums);
32+
33+
for (int i=len-1; i>=(len-k); i--) {
34+
swap(nums[0], nums[i]);
35+
adjust(nums, 0, i-1);
36+
}
37+
38+
return nums[len-k];
39+
}
40+
};
41+
42+
// 方法二
43+
class Solution {
44+
int part(vector<int> & nums, int low, int high)
45+
{
46+
int priv = nums[low];
47+
while (low<high) {
48+
while (low<high && nums[high] >= priv)
49+
high--;
50+
nums[low] = nums[high];
51+
while (low<high && nums[low] <= priv)
52+
low++;
53+
nums[high] = nums[low];
54+
}
55+
nums[low] = priv;
56+
return low;
57+
}
58+
59+
int quick_select(vector<int> & nums, int k, int start, int end)
60+
{
61+
62+
int priv = part(nums, start, end);
63+
if (priv == k)
64+
return nums[priv];
65+
66+
if (priv > k)
67+
return quick_select(nums, k, start, priv-1);
68+
else if (priv < k)
69+
return quick_select(nums, k, priv+1, end);
70+
return -1;
71+
}
72+
73+
public:
74+
int findKthLargest(vector<int>& nums, int k) {
75+
int len = nums.size();
76+
return quick_select(nums, len-k, 0, len-1);
77+
}
78+
};
79+

‎sort/README.md

+4-4
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void SelectSort(ElemType A[]. int n)
5252
}
5353
```
5454
55-
## 堆排序
55+
## [堆排序](./heap_sort.cpp)
5656
5757
算法思想:
5858
@@ -80,7 +80,7 @@ void BuildMaxHeap(ElemType A[], int len)
8080
void AdjustDown(ElemType A[], int k, int len)
8181
{
8282
A[0] = A[k];
83-
for (i=2*k); i<=len; i*=2) {
83+
for (i=2*k; i<=len; i*=2) {
8484
if (i<len && A[i]<A[i+1])
8585
i++;
8686
if (A[0] >= A[i])
@@ -277,8 +277,8 @@ void MergeSort(ElemType A[], int low, int high)
277277
| 冒泡排序 |![](http://latex.codecogs.com/gif.latex?O(n)) |![](http://latex.codecogs.com/gif.latex?O(n^2)) | ![](http://latex.codecogs.com/gif.latex?O(n^2)) | ![](http://latex.codecogs.com/gif.latex?O(1)) ||
278278
|简单选择排序 | ![](http://latex.codecogs.com/gif.latex?O(n^2)) | ![](http://latex.codecogs.com/gif.latex?O(n^2)) | ![](http://latex.codecogs.com/gif.latex?O(n^2)) | ![](http://latex.codecogs.com/gif.latex?O(1)) ||
279279
| 快速排序 | ![](http://latex.codecogs.com/gif.latex?O(nlogn)) |![](http://latex.codecogs.com/gif.latex?O(nlogn)) | ![](http://latex.codecogs.com/gif.latex?O(n^2)) | ![](http://latex.codecogs.com/gif.latex?O(log(n+1))) ||
280-
| 归并排序 | || | | |
281-
| 堆排序 | | | | | |
280+
| 归并排序 | ![](http://latex.codecogs.com/gif.latex?O(nlogn)) |![](http://latex.codecogs.com/gif.latex?O(nlogn))| ![](http://latex.codecogs.com/gif.latex?O(nlogn)) | ![](http://latex.codecogs.com/gif.latex?O(n)) | |
281+
| 堆排序 | ![](http://latex.codecogs.com/gif.latex?O(nlogn)) | ![](http://latex.codecogs.com/gif.latex?O(nlogn)) | ![](http://latex.codecogs.com/gif.latex?O(nlogn)) | ![](http://latex.codecogs.com/gif.latex?O(n)) | |
282282
| 桶排序 | | | | | |
283283

284284

‎sort/heap_sort.cpp

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#include <iostream>
2+
3+
using namespace std;
4+
5+
void adjust_down(int * nums, int start, int end)
6+
{
7+
int dad = start;
8+
int son = dad*2+1;
9+
while (son <= end) {
10+
if (son+1 <= end && nums[son]<=nums[son+1])
11+
son++;
12+
if (nums[dad] > nums[son])
13+
return ;
14+
else {
15+
swap(nums[dad], nums[son]);
16+
dad = son;
17+
son = dad*2+1;
18+
}
19+
}
20+
}
21+
22+
void build_max_heap(int * nums, int len)
23+
{
24+
for (int i=len/2-1; i>=0; i--) {
25+
adjust_down(nums, i, len-1);
26+
}
27+
}
28+
29+
void heap_sort(int * nums, int len)
30+
{
31+
build_max_heap(nums, len);
32+
for (int i=len-1; i>=0; i--) {
33+
swap(nums[0], nums[i]);
34+
adjust_down(nums, 0, i-1);
35+
}
36+
}
37+
38+
int main()
39+
{
40+
int nums[] = {7,6,5,4,3,2,1,1,0};
41+
//int nums[] = {0,0,1,1,2,3,4,5,6,7};
42+
43+
heap_sort(nums, sizeof(nums)/sizeof(int));
44+
45+
for (int i=0; i<sizeof(nums)/sizeof(int); i++)
46+
cout<<nums[i]<<" ";
47+
cout<<endl;
48+
49+
return 0;
50+
}

0 commit comments

Comments
 (0)
Please sign in to comment.