随性地记录下今天对插排和快排的学习
作者:互联网
直接插入排序与快速排序
<快速排序>
简单介绍完插入排序:
直接插入排序(Insertion Sort):是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序算法的一般步骤:
1.从第一个元素开始,该元素可以认为已被排序;
2.取出下一个元素,在已经排序的元素序列中从后向前扫描;
3.如果该元素(已排序)大于新元素,将该元素移到下一个位置;
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5.将新元素插入到该位置后,重复2~5
好了。
附上自己巧的代码:
void insertsort(int arr[],int low,int high)
{
for (int i=low+1;i<=high;++i)
for (int j=i;arr[j]<arr[j-1]&&j>1;--j)
swap(arr[j],arr[j-1]);
}
学习自 : 这
里面有其他几类插入排序的实现方法,也有图解
<快速排序>
前言
- 为什么要用快速排序?
因为不让用sort,因为快,能在短时间内处理大规模的数据。 - 快速排序实现的主要思路:
1.将待排序的数据放入数组arr中,从arr[low]到arr[high]
2.如果带排序的元素个数为 0 或 1,排序结束。
3.从待排序数据中任选一个数据作为分段基准。将它存入变量k
4.扫描数组里每个数,把它们分为两组,一组数比k小,放右边,一组比k大,放左边,k 放中间。
5.对前一半和后一半重复上述方法排序。直到 ' 2.'中结束条件满足。
接下来解释代码实现
代码实现
可以把代码分为两步进行,先对数据进行分段。
1.分段
void quicksort(int arr[],int low,int high)
{
int mid;
if(low>=high) return;//待分段的元素只有一个或0个,这时候不能再次分段,也就是说对于这一小段来说排序已经完成,是二分到极限时候的"出口"。
mid=divide(arr,low,high); //返回分段点 mid ,具体在排序里介绍。
quicksort(a,low,mid-1); //排序左一半
quicksort(a.mid+1,high); //排序右一半
}
2.排序
对于每一段排序,我们只要选择一个base(基准),把小于这个base的数排序到
base左边,大于base的排序到右边就好,这样当不能继续分段时,这一组数据就排序好了。
int divide (int arr[],int low,int high)
{
int temp=rand()%(high-low+1)+low;
swap(arr[low],arr[temp]);
int base=arr[low];
bool flag=1;
while (low!=high)
{
switch(flag)
{
case 0: if (arr[low]>=base) {arr[high--]=arr[low];flag=1;}
else ++low;
break;
case 1: if (arr[high]<base) {arr[low++]=arr[high];flag=0;}
else --high;
break;
}
}
arr[low]=base;
return low;
}
没了,洛谷题试了一个下午还是tle,用了随机值还是tle,在排序数目较小时还是tle,对相同值特殊处理也懒得弄了,于是换了思路自己设计了个快排连运行都不成功= =,原因虽然也弄清楚了,但受挫感极大,就一直弄到刚刚。以后用空把注释补一下。
学习自:
C++程序设计|思想与方法(我的教材)
给自己放个小假,这周末至少要把简单dp的原理和回溯法解决,然后针对性刷洛谷题目了吧?(大概)
标签:arr,插排,随性,high,快排,int,base,low,排序 来源: https://www.cnblogs.com/Flowyuan-Foreverworld/p/13939311.html