Skip to content

Commit 11aa469

Browse files
committed
add a series of sorting functions
1 parent 986668a commit 11aa469

File tree

6 files changed

+130
-39
lines changed

6 files changed

+130
-39
lines changed

Vector/Vector/Vector.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class Vector
1111
elem_ = new T[capacity_ = c];
1212
for (size_ = 0; size_ < s; elem_[size_++] = e);
1313
}
14+
1415
Vector(T* array, int lo, int hi) { copyFrom(array, lo, hi); }
1516
Vector(T* array, int n) { copyFrom(array, 0, n); }
1617
Vector(Vector<T> const& v) { copyFrom(v.elem_, 0, v.size_); }
@@ -30,10 +31,15 @@ class Vector
3031
T append(T const& e);//insert an element in the last
3132
int removeFrom(int lo, int hi);//remove elements in range of [lo,hi)
3233
T remove(int loc);
34+
/*sort*/
3335
void mergeSort(int lo, int hi);
3436
void merge(int lo, int mi, int hi);
3537
void sort() { mergeSort(0, size_); }
36-
38+
void heapSort(int lo, int hi);
39+
void quickSort(int lo, int hi);
40+
int partition(int lo, int hi);
41+
void shellSort(int lo, int hi);
42+
void shellInsert(int lo, int hi, int step);
3743
protected:
3844
T* elem_;
3945
int capacity_;

Vector/Vector/Vector.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
<ItemGroup>
114114
<ClInclude Include="Vector.h" />
115115
<ClInclude Include="vector_implement.h" />
116+
<ClInclude Include="vector_implement_sort.h" />
116117
</ItemGroup>
117118
<ItemGroup>
118119
<ClCompile Include="main.cpp" />

Vector/Vector/Vector.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
<ClInclude Include="vector_implement.h">
2222
<Filter>头文件</Filter>
2323
</ClInclude>
24+
<ClInclude Include="vector_implement_sort.h">
25+
<Filter>头文件</Filter>
26+
</ClInclude>
2427
</ItemGroup>
2528
<ItemGroup>
2629
<ClCompile Include="main.cpp">

Vector/Vector/main.cpp

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,11 @@
33

44
int main(int argc, char* argv[])
55
{
6-
int a[] = {1,2,3,4,5,6,7,8};
7-
Vector<int> v(a, 8);
8-
v.sort();
9-
for (int i = 0; i < v.size(); ++i)
10-
{
11-
std::cout << v[i] << ' ';
12-
}
13-
std::cout << v.search(5);
14-
v.insert(4, 4);
15-
std::cout << v.search(5);
16-
v.remove(4);
17-
std::cout << v.search(5);
6+
int a[] = { 4,4,5,7,8,0,2,2,4,76,4,87,1 };
7+
Vector<int> v(a, sizeof(a) / sizeof(int));
8+
v.shellSort(0,v.size());
9+
// for (int i = 0; i < v.size(); ++i)
10+
// {
11+
// std::cout << v[i] << ' ';
12+
// }
1813
}

Vector/Vector/vector_implement.h

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -70,29 +70,4 @@ int Vector<T>::search(T const& e,int lo,int hi) const
7070
}
7171
return --lo;
7272
}
73-
template <typename T>
74-
void Vector<T>::mergeSort(int lo, int hi)
75-
{
76-
if (hi - lo < 2) return;
77-
int mi = (lo + hi) >> 1;
78-
mergeSort(lo, mi);
79-
mergeSort(mi, hi);
80-
merge(lo, mi, hi);
81-
}
82-
template <typename T>
83-
void Vector<T>::merge(int lo, int mi, int hi)
84-
{
85-
T* former = new T[mi - lo];
86-
for (int i = 0,j=lo; j < mi; ++i,++j)
87-
{
88-
former[i] = elem_[j];
89-
}
90-
for (int i = 0, j = mi, k = lo; i < mi - lo || j < hi;)
91-
{
92-
if ((i < mi - lo) && ((!(j < hi) || former[i] <= elem_[j])))
93-
elem_[k++] = former[i++];
94-
if ((j < hi) && (!(i < mi - lo) || former[i] > elem_[j]))
95-
elem_[k++] = elem_[j++];
96-
}
97-
delete[]former;
98-
}
73+
#include"vector_implement_sort.h"

Vector/Vector/vector_implement_sort.h

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#pragma once
2+
#include <ostream>
3+
#include <iostream>
4+
5+
template <typename T>
6+
void Vector<T>::mergeSort(int lo, int hi)
7+
{
8+
if (hi - lo < 2) return;
9+
int mi = (lo + hi) >> 1;
10+
mergeSort(lo, mi);
11+
mergeSort(mi, hi);
12+
merge(lo, mi, hi);
13+
}
14+
15+
template <typename T>
16+
void Vector<T>::merge(int lo, int mi, int hi)
17+
{
18+
T* former = new T[mi - lo];
19+
for (int i = 0, j = lo; j < mi; ++i, ++j)
20+
{
21+
former[i] = elem_[j];
22+
}
23+
for (int i = 0, j = mi, k = lo; i < mi - lo || j < hi;)
24+
{
25+
if ((i < mi - lo) && ((!(j < hi) || former[i] <= elem_[j])))
26+
elem_[k++] = former[i++];
27+
if ((j < hi) && (!(i < mi - lo) || former[i] > elem_[j]))
28+
elem_[k++] = elem_[j++];
29+
}
30+
delete[]former;
31+
}
32+
33+
#include "D:\OneDrive\OneDrive - stu.ncwu.edu.cn\PQ_ComplHeap\PQ_ComplHeap\PQ_ComplHeap/PQ_ComplHeap.h"
34+
35+
template <typename T>
36+
void Vector<T>::heapSort(int lo, int hi)
37+
{
38+
PQ_ComplHeap<T> pq(elem_, hi - lo);
39+
for (int i = hi - 1; i >= lo; --i)
40+
{
41+
elem_[i] = pq.delMax();
42+
}
43+
}
44+
45+
template <typename T>
46+
void Vector<T>::quickSort(int lo, int hi)
47+
{
48+
if (hi - lo < 2)
49+
return;
50+
int mi = partition(lo, hi - 1);
51+
quickSort(lo, mi);
52+
quickSort(mi + 1, hi);
53+
}
54+
55+
template <typename T>
56+
int Vector<T>::partition(int lo, int hi)
57+
{
58+
std::swap(elem_[lo], elem_[lo + rand() % (hi - lo + 1)]);
59+
T pivot = elem_[lo];
60+
while (lo < hi)
61+
{
62+
while ((lo < hi) && (pivot <= elem_[hi]))
63+
--hi;
64+
elem_[lo] = elem_[hi];
65+
while ((lo < hi) && (elem_[lo] <= pivot))
66+
++lo;
67+
elem_[hi] = elem_[lo];
68+
}
69+
elem_[lo] = pivot;
70+
return lo;
71+
}
72+
73+
template <typename T>
74+
void Vector<T>::shellSort(int lo, int hi)
75+
{
76+
int a[] = {1,3,7,15,31,64};
77+
Vector<int> step(a, sizeof(a) / sizeof(int));
78+
for (int i = step.search(hi - lo); i >= 0; --i)
79+
{
80+
shellInsert(lo, hi, step[i]);
81+
for (int i = 0; i < this->size(); ++i)
82+
{
83+
std::cout << elem_[i] << ' ';
84+
}
85+
std::cout << std::endl;
86+
}
87+
}
88+
89+
template <typename T>
90+
void Vector<T>::shellInsert(int lo, int hi, int step)
91+
{
92+
for (int col = 0; col < step; ++col)
93+
{
94+
int cur_elem;
95+
for (cur_elem = lo + step + col; cur_elem < hi; cur_elem += step)
96+
{
97+
int loc_to_insert;
98+
T temp = elem_[cur_elem];
99+
for (loc_to_insert = cur_elem - step; loc_to_insert >= lo; loc_to_insert -= step)
100+
{
101+
if (elem_[loc_to_insert] < elem_[cur_elem])
102+
break;
103+
}
104+
for (int move_index = cur_elem - step; move_index > loc_to_insert; move_index -= step)
105+
{
106+
elem_[move_index + step] = elem_[move_index];
107+
}
108+
elem_[loc_to_insert + step] = temp;
109+
}
110+
}
111+
}

0 commit comments

Comments
 (0)