排序
- 冒泡排序
- 插入排序
- 希尔排序
- 选择排序
- 归并排序·
- 快速排序
- 堆排序
- 二叉排序树
冒泡排序
template<typename T>
void bulbleSort(T &arr,int nSize) {
int i, j;
for (i = 0; i < nSize; ++i) {
for (j = 0; j < nSize - i - 1; ++j) {
if (arr[j + 1] < arr[j]) {
swap(arr[j+1], arr[j]);
}
}
}
插入排序
/*
1.从第一个元素开始 该元素可以为已经被排序
2.取出下一个元素,在已经排序后的元素中从后向前扫描
3.如果该元素(已排序)大于新元素,将该元素移动到下一位置
4.重复步骤3,直到找到已经排序的元素小于或者等于新元素的位置
5.将新元素插入到该位置
6.重复2-5步骤
*/
template <typename T>
void InsertSort(T *arr,size_t size) {
int i, j;
T temp;
for (i = 1; i < size; ++i) {
j = i - 1;//有序最后一个元素的下标
temp = arr[i];
while (j >= 0 && arr[j] > temp) {
arr[j + 1] = arr[j];//不满足 就后移
j--;
}
arr[j + 1] = temp;
}
}
希尔排序
/*
插入排序的优化
*/
template<typename T>
void ShellSort(T *arr,size_t size ) {
int i, j;
T temp;
int gap;//定义步长 一般为数组大小的一半
for (gap = size / 2; gap > 0; gap /= 2) {
for (i = gap; i < size; ++i) {
j = i - gap;
temp = arr[i];
while (j >= 0 && arr[j] > temp) {
arr[j + gap] = arr[j];
j -= gap;
}
arr[j + gap] = temp;
}
}
}
归并排序
//利用分而治之的思想 :归并 + 递归
void Merge(int* arr, int left, int mid, int right) {
int low = left;
int high = right;
int length = high - left + 1;
//开一个辅助数组 存放临时结果
int index = 0;
vector<int> temp(length);
while (left <= mid && high <= right) {
if (arr[low] < arr[high]) {
temp[index++] = arr[low++];
}
else {
temp[index++] = arr[high++];
}
}
//左边有剩余
while (low <= mid) {
temp[index++] = arr[low++];
}
//右边有剩余
while (high <= right) {
temp[index++] = arr[high++];
}
//保存最终结果
for (int i = 0; i < length; ++i) {
arr[left + i] = temp[i];
}
}
void MergeSort(int *arr,int left,int right) {
if (left < right) {
//1.分割
int mid = (left + right) / 2;
MergeSort(arr,left,mid);
MergeSort(arr, mid + 1, right);
//2.合并
Merge(arr,left,mid,right);
}
return;
}
快速排序
template<typename T>
void quickSort(T *arr, int left, int right){
if (left < right) {
int i = left;
int j = right;
int temp = arr[i];//保存第一个 作为基准值
while (i < j) {
while (i < j && arr[j] > temp) {//左边排序
j--;
}//要么左边小于右边 要么arr[j] < temp 退出
if (i < j) {
arr[i++] = arr[j];//将不满足条件 放入正确的位置
}
while (i < j && arr[i] < temp) {//右边排序
i++;
}//要么左边小于右边 要么 arr[i] > temp
if (i < j) {
arr[j--] = arr[i];//将不满足条件的 放入正确的位置
}
arr[i] = temp;
}
//递归左边 排序
quickSort(arr, left, i - 1);
//递归右边 排序
quickSort(arr, i + 1, right);
}
}
堆排序
二叉排序树