抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

CodingStudio

努力进步

引言

  • 在准备面试时的手撕代码记录

排序算法

  • 冒泡排序

  • 选择排序

  • 插入排序

  • 希尔排序

  • 归并排序

  • 快速排序

  • 堆排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <iostream>
#include <vector>

// 冒泡排序
void bubble_sort(std::vector<int>& array){
int array_ = 0;
bool exchange = false;
for(int i=0;i<array.size()-1;++i){
exchange = false;
for(int j=0;j<array.size()-1-i;++j){
if(array[j] > array[j+1]){
array_ = array[j+1];
array[j+1] = array[j];
array[j] = array_;
exchange = true;
}
}
if(!exchange) break; // 如果没有进行交换, 提前结束
}
}

// 选择排序
void select_sort(std::vector<int>& array){
int array_ = 0;
for(int i=0;i<array.size()-1;++i){
for(int j=i;j<array.size();++j){
if(array[j] < array[i]){
array_ = array[j];
array[j] = array[i];
array[i] = array_;
}
}
}
}

// 插入排序
void insert_sort(std::vector<int>& array){
int array_ = 0;
for(int i=1;i<array.size();++i){ //从下标为1的元素开始进行
int array_ = array[i]; //记录待插入元素
int j; //从已排序序列的最右边开始查找, 找到比待插入元素最小的元素位置
for(j=i;j>=1 && array_<array[j-1];j--){
array[j] = array[j-1];
}
array[j] = array_; //插入
}
}

// 希尔排序
void hill_sort(std::vector<int>& array){
int array_ = 0;
for(int step = array.size()/2;step>0;step/=2){
for(int i=0;i<step;i++){
std::cout << "step: " << step << "";
//使用直接插入排序进行
for(int j=i+step;j<array.size();j+=step){
array_ = array[j];
int m;
for(m=j;m>=step && array_ < array[m-step];m-=step)
array[m] = array[m-step];
array[m] = array_;
}
for(auto i : array)
std::cout << i << ' ';
std::cout << std::endl;
}
}
}

void merge(std::vector<int>& array, int left, int mid, int right){
// 采用分治思想
std::vector<int> array_(array.size());
int i=left, j=mid+1,k=0;
while(i<=mid && j<=right){
if(array[i] <= array[j]){ // 从小到大存放在array_中
array_[k++] = array[i++];
}else{
array_[k++] = array[j++];
}
}
// 剩余元素存放
while (i<=mid)
{
array_[k++] = array[i++];
}
while(j<=right){
array_[k++] = array[j++];
}
// 数据转移
k = 0;
for(int i=left;i<=right;i++){
array[i] = array_[k++];
}
}

// 归并排序
void merge_sort(std::vector<int>& array, int left, int right){
if(left < right){
int mid = left + (right-left)/2;
merge_sort(array, left, mid);
merge_sort(array, mid+1, right);
merge(array, left, mid, right);
}
}


// 快速排序
void quick_sort(std::vector<int>& array, int left, int right){
if(left >= right) return;
int lp = left;
int rp = right;
int pivot = array[lp];
while(lp < rp){
// 寻找比基准小的值, 并交换
while(lp < rp && array[rp] >= pivot){
rp--;
}
if(lp < rp) array[lp] = array[rp];
// 寻找比基准大的值, 并交换
while(lp < rp && array[lp] <= pivot){
lp++;
}
if(lp < rp) array[rp] = array[lp];
// 重合, 赋值
if(lp == rp) array[lp] = pivot;
}
quick_sort(array, left, lp-1); // 基准左侧
quick_sort(array, lp+1, right); // 基准右侧
}

void heapify(std::vector<int>& array, int n, int i){
if(i>=n) return;

int largest = i;
int lson = i*2+1;
int rson = i*2+2;

int array_ = 0;
if(lson < n && array[largest] < array[lson]){
largest = lson;
}
if(rson < n && array[largest] < array[rson]){
largest = rson;
}
if(largest!=i){
array_ = array[i];
array[i] = array[largest];
array[largest] = array_;
heapify(array, n, largest);
}
}

// 堆排序
void heap_sort(std::vector<int>& array){
int lastNode = array.size()-1;
int parent = (lastNode-1)/2;
for(int i=parent;i>=0;i--){
heapify(array, array.size(), i);
}
for(int i=array.size()-1;i>=0;--i){
heapify(array, i, 0);
}
}

int main(){
std::vector<int> array{3,4,2,5,6,1,7,9,8,0,0,1,30,20,0,-5};
// int array[10] = {3,4,2,5,6,1,7,9,8,0};
std::cout << "original: " << std::endl;
for(auto i : array)
std::cout << i << ' ';
std::cout << std::endl;
// merge_sort(array, 0, array.size()-1);
quick_sort(array, 0, array.size()-1);
std::cout << "\nafter:" << std::endl;
for(auto i : array)
std::cout << i << ' ';
}

深度学习基础

评论