1:排序
①冒泡,最简单的排序,以从小到大为例,逻辑就是将值更大的元素放在数列的后面,通过交换实现。
//冒泡排序
#include<iostream>
using namespace std;
void BubbleSort(int* arr, int n)
{
int i , j , temp =0;
for (i=0; i < n - 1; i++)
{
for (j=0; j < n - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
②快排,先从数列中取出一个数作为基准值;分区过程中,将比这个数大的数全放在它的右边,比这个数小的全放在它的左边;再对左右分区重复第二步,直到各区间只有一个数。
//双向快速排序
#include<iostream>
using namespace std;
void QuickSort(int* arr,int left, int right)
{
if (left > right)
{
return;
}
int i = left;
int j = right;
//最左边的为准基数
int flag = arr[left];
while (i != j)
{
//从右侧找到一个比标记小的值
while (arr[j] > flag && i < j)
{
j--;
}
//从左侧找到一个比标记大的值
while (arr[i] <= flag && i < j)
{
i++;
}
//交换找到的值,使左边小,右边大
int temp = 0;
if (i<j)
{
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}//完成while循环,此时i=j
//交换准基数和相遇值,即将中值归位
arr[left] = arr[i];
arr[i] = flag;
//将中值左,右侧的数据分别进行排序(递归)
QuickSort(arr, left, i - 1);
QuickSort(arr, i + 1, right);
}
③插入排序 ,将待排序的元素看为一个有序表和一个无序表,开始时无序表只包含一个元素,无序表包含n-1个元素;排序过程中每次从无序表中取出第一个元素,将它与有序表元素依次比较,插入有序表中的合适位置;重复第二步,直到无序表不存在元素。(for循环加while排序)
#include<iostream>
using namespace std;
//元素集合接近有序时,直接插入排序效率较高.
//直接插入排序,顺序查找
void Insertion_Sort(int* arr, int n)
{
int i = 0, flag = 0, step = 0;
for (i = 1; i < n; i++)
{
flag = arr[i];
step = i - 1;
while (step >= 0 && flag<arr[step])
{
arr[step + 1] = arr[step];
step--;
}
arr[step + 1] = flag;
}
}
//直接插入排序,二分查找
void Insert_Sort_Second(int* arr,int size)
{
int left = 0;
int right = size - 1;
int mid = 0;
int i = 0;
int key = 0;
for (i = 1; i < size; i++)
{
key = arr[i];
left = 0;
right = i - 1;
//二分查找寻找待插入元素的位置
while (left <= right)
{
mid = (left + right) >> 1;// >>1 相当于 /2
if (key<arr[mid])
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
//搬移left位置以后的元素
right = i - 1;
while (right >= left)
{
arr[right + 1] = arr[right];
right--;
}
//插入元素
arr[left] = key;
}
}
④选择排序:在待排序的元素中找到最小的元素放在序列的首位置,找到最大的元素放在序列的末尾,然后抛开首位和末尾,继续重复该步骤,直到排序完毕。(使用双指针)
//直接选择排序
#include<iostream>
using namespace std;
void swap(int *a, int *b){
int ret = 0;
ret = *a;
*a = *b;
*b = ret;
}
void SelectionSort(int* arr, int size)
{
int left = 0;
int right = size - 1;
int i = 0;
while (left<right)
{
int MinIndex = left;
int MaxIndex = left;
for (i = left; i <= right; i++)
{
if (arr[MinIndex]>arr[i])
MinIndex = i;
if (arr[MaxIndex]<arr[i])
MaxIndex = i;
}
swap(&arr[left], &arr[MinIndex]);
if (MaxIndex == left)
{
MaxIndex = MinIndex;
}
swap(&arr[right], &arr[MaxIndex]);
left++;
right--;
}
}
⑤归并排序
⑥堆排序
⑦希尔排序
⑧计数排序