下方所有除使用STL库外的所有排序算法调用方法都是qsort(a,0,n-1);
初级排序算法
冒泡排序
1 | void bubblesort(int* arr, int left, int right) |
选择排序
1 | void selectionsort(int* arr, int left, int right) |
插入排序
同整理扑克牌,依次将每个元素插入到前面有序的部分。1
2
3
4
5
6
7
8
9
10
11void insertionsort(int* arr, int left, int right)
{
for(int i=left;i<=right;i++)
{
int cnt=arr[i];
for(int j=i-1;j>=left && cnt<=arr[j];j--)
{
swap(arr[j],arr[j+1]);
}
}
}
优化:可以利用折半查找的方法找到插入的位置,即折半插入排序
希尔排序
通过给定间隔h
,使得原来的数组被切分为更小的数组,进而提升插入排序效率1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17void shellsort(int* arr, int left, int right)
{
int h=1;
while(h<(right-left+1)/3) h=h*3+1;
while(h>=1)
{
for(int i=left;i<(right-left+1)/h;i++)
{
int cnt=arr[i];
for(int j=i-h;j>=left && cnt<=arr[j];j-=h)
{
swap(arr[j],arr[j+h]);
}
}
h/=3;
}
}
进阶排序算法
归并排序
1 | void merge(int *arr, int left, int right) |
快速排序
partition
函数:以当前给定集合的第一个元素pivot
作为基准,比其小的放在左边,比其大的放在右边- 随后对
pivot
左右的数组分别进行排序,直至left=right
结束分治
手写快排
- 可参考(全网最清晰快速排序)[https://www.bilibili.com/video/BV1vP411g7J3]
1 | int partition(int* arr, int left, int right) |
STL sort
排序规则1
2
3
4
5//调用:sort(a,a+n,cmp);
bool cmp(int a, int b)
{
return a<b;
}