常用排序算法?
稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。
冒泡排序算法:
比较相邻的元素,按照顺序进行交换,一次遍历后,就会有一个最大(最小)交换至顶端,重复步骤即可。
python实现:
arr = [54,26,93,17,77,31,44,55,20]
#bubble
def bubbleSort(arr):
for i in range(len(arr),0,-1):
for j in range(i - 1):
if(arr[j] > arr[j + 1]):
arr[j+1], arr[j] = arr[j], arr[j+1]
bubbleSort(arr)
print(arr)
C++实现:
void bubbleSort(vector<int>& arr){
for (int i = arr.size(); i > 0 ; i--){
for (int j = 0; j < i - 1; j++){
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
vector<int> arr{ 54, 26, 93, 17, 77, 31, 44, 55, 20 };
bubbleSort(arr);
for (int i = 0; i < arr.size(); i++){
cout << arr[i] << ' ';
}
插入排序算法:
通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
python实现:
arr = [54,26,93,17,77,31,44,55,20]
def insertSort(arr):
for i in range(1, len(arr)):
for j in range(i,0,-1):
if(arr[j - 1] < arr[j]):
arr[j - 1], arr[j] = arr[j], arr[j - 1]
insertSort(arr)
print(arr)
C++实现:
void insertSort(vector<int>& arr){
for (int i = 1; i < arr.size(); i++){
for (int j = i; j >= 1; j--){
if (arr[j] > arr[j - 1]){
int temp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = temp;
}
}
}
}
vector<int> arr{ 54, 26, 93, 17, 77, 31, 44, 55, 20 };
insertSort(arr);
for (int i = 0; i < arr.size(); i++){
cout << arr[i] << ' ';
}
归并排序算法:
归并排序的思想就是先递归分解数组,再合并数组。
python实现:
arr = [54,26,93,17,77,31,44,55,20]
def mergeSort(arr):
if(len(arr) < 2):
return arr
mid = int(len(arr)/2)
l_arr = mergeSort(arr[:mid])
r_arr = mergeSort(arr[mid:])
#merge
result = []
l, r = 0,0
while(l < len(l_arr) and r < len(r_arr)):
if(l_arr[l] < r_arr[r]):
result.append(l_arr[l])
l += 1
else:
result.append(r_arr[r])
r += 1
result += l_arr[l:]
result += r_arr[r:]
return result
arr = mergeSort(arr)
print(arr)
C++实现
void mergeSort(vector<int>& arr, int start, int end ){
if (end - start < 1){
return ;
}
int mid = start + (end - start) / 2;
mergeSort(arr, start, mid);
mergeSort(arr, mid + 1, end);
//merge
int left = start;
int right = mid + 1;
vector<int> temp;
while (left <= mid && right <= end){
if (arr[left] < arr[right]){
temp.push_back(arr[left++]);
}
else{
temp.push_back(arr[right++]);
}
}
while (left <= mid){
temp.push_back(arr[left++]);
}
while (right <= end){
temp.push_back(arr[right++]);
}
for (int i = start; i <= end; i++){
arr[i] = temp[i - start];
}
}
vector<int> arr{ 54, 26, 93, 17, 77, 31, 44, 55, 20 };
mergeSort(arr, 0, arr.size() - 1);
for (int i = 0; i < arr.size(); i++){
cout << arr[i] << ' ';
}