目录
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 快排
0 综述
0.1算法分类
十种常见排序算法可以分为两大类:
- 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
- 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。
0.2 算法复杂度
0.3 相关概念
- 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
- 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
- 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
- 空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。 ‘
十大经典排序算法(动图演示)https://www.cnblogs.com/onepixel/p/7674659.html
1 常考排序
1.1快速排序(Quick Sort)
//快速排序
//双边循环法
int partion(int arr[],int low,int high)
{
int startIndex=low;
int pivot=arr[low];
while(low<high)
{
while ((low<high) &&arr[high]>=pivot)
{
high--;
}
while((low<high) && arr[low]<=pivot)
{
low++;
}
if (low<high)
{
int tmp=arr[high];
arr[high]=arr[low];
arr[low]=tmp;
}
}
arr[startIndex]=arr[low];
arr[low]=pivot;
return low;
}
//单边循环法
int partion(int arr[],int low,int high)
{
int mark=low;
int pivot=arr[low];
for (int i=low;i<high;i++)
{
if (arr[i]<pivot)
{
mark++;
int tmp=arr[mark];
arr[mark]=arr[i];
arr[i]=tmp;
}
}
arr[low]=arr[mark];
arr[mark]=pivot;
return mark;
}
void quickSort(int arr[],int low,int high)
{
if (low<high)
{
int idx=partion(arr,low,high);
quickSort(arr,low,idx-1);
quickSort(arr,idx+1,high);
}
}
1.2 归并排序(Merge Sort)
//归并排序
/*
使用分治思想:
假设两个子数组是有序的,将其按照有序序列合并,合并组成新的有序数组,再与其他部分合并
排序算法:归并排序【图解+代码】https://www.bilibili.com/video/BV1Pt4y197VZ?from=search&seid=7880178413492422518
*/
void merge(int arr[], int low, int mid, int high, int temp[])
{
int i = low; //左子数组开始位置
int j = mid + 1; //右子数组开始位置
int t = 0; //临时空间指针
while (i <= mid && j <= high)
{
if (arr[i] < arr[j])
temp[t++] = arr[i++];
else
temp[t++] = arr[j++];
}
//将左边剩余元素填充进temp中
while (i <= mid)
temp[t++] = arr[i++];
//将右边子数组剩余部分填充到temp中
while (j <= high)
temp[t++] = arr[j++];
//将融合后的数据拷贝到原来的数据对应的子空间中
t = 0;
while (low <= high)
{
arr[low++] = temp[t++];
}
}
void MergeSort(int arr[], int low, int high, int temp[])
{
if (low < high) //只有low==high为一个元素的时候不用再细分自分组,融合
{
int mid = (low + high) / 2;
//递归划分左半区
MergeSort(arr, low, mid, temp);
//递归划分右半区
MergeSort(arr, mid + 1, high, temp);
//合并已经排序的部分
merge(arr, low, mid, high, temp);
}
}