排序算法总结
概念:
1、稳定度:稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序。也就是一个排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的串行中R出现在S之前,在排序过的串行中R也将会是在S之前。
2、计算的复杂度(最差、平均、和最好表现),依据串行(list)的大小(n)。一般而言,好的表现是O(n log n),且坏的行为是O(n2)。对于一个排序理想的表现是O(n)。仅使用一个抽象关键比较运算的排序算法总平均上总是至少需要O(n log n)。
.
稳定排序:
泡沫排序(bubble sort) — O(n?)
插入排序 (insertion sort)— O(n?)
桶排序 (bucket sort)— O(n); 需要 O(k) 额外空间
计数排序 (counting sort) — O(n+k); 需要 O(n+k) 额外空间 合并排序 (merge sort)— O(n log n); 需要 O(n) 额外空间
二叉排序树排序 (Binary tree sort) — O(n log n)期望时间; O(n?)最坏时间; 需要 O(n) 额外空间
基数排序 (radix sort)— O(n·k); 需要 O(n) 额外空间
不稳定排序
选择排序 (selection sort)— O(n?)
希尔排序 (shell sort)— O(n log n) 如果使用最佳的现在版本 堆排序 (heapsort)— O(n log n)
快速排序 (quicksort)— O(n log n) 期望时间, O(n2) 最坏情况; 对于大的、乱数串行一般相信是最快的已知排序
排序的算法有很多,对空间的要求及其时间效率也不尽相 同。下面列出了一些常见的排序算法。这里面插入排序和冒泡排序又被称作简单排序,他们对空间的要求不高,但是时间效率却不稳定;而后面三种排序相对于简单 排序对空间的要求稍高一点,但时间效率却能稳定在很高的水平。基数排序是针对关键字在一个较小范围内的排序算法。
这篇文章里,将对几种基础排序介绍,包括冒泡排序、插入排序、选择排序、快速排序。稍微复杂些的排序留在二中介绍。
1、冒泡排序
冒泡排序是一种简单的排序方法,算法如下:
1. 首先将所有待排序的数字放入工作列表中。
2. 从列表的第一个数字到倒数第二个数字,逐个检查:若某一位上的数字大于他的下一位,则将它与它的下一位交换。
3. 重复2号步骤(倒数的数字加1。例如:第一次到倒数第二个数字,第二次到倒数第三个数字,依此类推...),直至再也不能交换。
用C语言实现如下:
int BubbleSort(int *a, int b){ //a是待排序的整型数组
//b是待排序数组的元素个数 int i;
int temp;
for(i = b-1; i>=0; i++){
if(a[i]>a[i+1]){
temp = a[i+1];
a[i+1] = a[i];
a[i] = temp; //交换元素
}
}
}
最差时间复杂度 O(n?)
最优时间复杂度 O(n)
平均时间复杂度 O(n?)
最差空间复杂度 O(n) total, O(1) auxiliary
.
2、插入排序
插入排序也是一种简单排序方法,算法如下:
1. 从第一个元素开始,认为该元素已经是排好序的。
2. 取下一个元素,在已经排好序的元素序列中从后向前扫描。
3. 如果已经排好序的序列中元素大于新元素,则将该元素往右移动一个位置。
4. 重复步骤3,直到已排好序的元素小于或等于新元素。
5. 在当前位置插入新元素。
6. 重复步骤2。
用C实现如下:
int InsertSort(int *a, int b){
int i,j;
int temp;
for(i = 0; i<</SPAN> b; i++){
temp = a[i];
for(j = i-1; j>=0; j--){
if(a[j] > temp)
a[j+1] = a[j]; //将元素往右移动
else{
a[j+1]=temp;
break;
}
}
}
}
最差时间复杂度 O(n?)
最优时间复杂度 O(n)
平均时间复杂度 O(n?)
最差空间复杂度 O(n) total, O(1) auxiliary
.
3、选择排序
选择排序的思想如下:
1. 设数组内存放了n个待排数字,数组下标从1开始,到n结束。
2. i=1
3. 从数组的第i个元素开始到第n个元素,寻找最小的元素。(具体过程为:先设arr[i]为最小,逐一比较,若遇到比之小的则交换)
4. 将上一步找到的最小元素和第i位元素交换。
5. 如果i=n-1算法结束,否则回到第3步
用C语言实现如下:
int SelectSort(int *a, int b){
int i,j;
int flag; //用于记录哪个元素最小
int temp;
for(i = 0; i<</SPAN> b; i++){
flag = i;
for(j = i+1; j a[j]){
flag = j;
} //选出从i开始最小的元素
}
temp = a[flag];
a[flag] = a[i];
a[i] = temp; //交换元素
}
}
最差时间复杂度 О(n?)
最优时间复杂度 О(n?)
平均时间复杂度 О(n?)
最差空间复杂度 О(n) total, O(1) auxiliary
.
以上三种排序的时间复杂度都是O(n?)。
.
4、快速排序
实践证明,快速排序是所有排序算法中最高效的一种。它采用了分治的思想:先保证列表的前半部分都小于后半部分,然后分别对前半部分和后半部分排序,这样整个列表就有序了。
快速排序的基本算法是:
1. 从数列中挑出一个元素,称为 "基准"(pivot),
2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。
3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
递回的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递回下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。
用C语言实现如下:
void swap(int *a, int *b)
{
int t=*a; *a=*b; *b=t;
}
int QuickSort(int *a, int b){
int i, j;
int base;
if(b>1){
base = a[0]; //设第一个元素为基准
i = 1; j = b-1;
while(i<</SPAN>j){
if(a[i]<</SPAN>base)
i++;
else
swap(&a[i],&a[j--]);//如果i位置的数大于基准,则往后移 }
if(a[i]<</SPAN>base){ //将基准插入到中间
swap(&a[0], &a[i]);
QuickSort(a, i+1);
QuickSort(&a[i+1], b-i-1);
}
else{
swap(&a[0], &a[i+1]);
QuickSort(a, i);
QuictSort(&a[i],b-i);
}
}
}
快速排序的时间复杂度是O(nlogn),但是最坏情况下复杂度是O(n?)。 最差时间复杂度 Θ(n?)
最优时间复杂度 Θ(nlogn)
平均时间复杂度 Θ(nlogn) comparisons
最差空间复杂度 根据实现的方式不同而不同
第二篇:浅谈淘宝搜索排序算法
惊喜惊喜,最给力的淘宝活动——聚划算,成就喜悦
给力的20xx年,小店在3月1号参加了超人气的聚划算团购活动,成为我们店有史以来销量最火爆的一次,相信活动一次会比一次做的好的,浮云都不是神马跑出来的。
团购活动,团的是超值,是优惠,是惊喜。在我们计划报名活动之前就在为这次能办个高潮迭起的聚团活动而忙碌着,其实做过聚划算的卖家都知道聚划算是一个超高人去关注的淘宝团购平台,一旦参加进去带来的流量是惊人的,二期关联的销售也会高涨,所以当时我们相当的用心。
做完这次聚划算的活动心里一直存着感激,我想说的是聚划算小二很负责任,帮我们准备齐全了资料给我们学习,聚划算的人员耐心的程度不是你能想象得到的。耐心的指导。不懂得地方直说到你明白为止,让你了解聚划算是怎样的一个操作流程,聚划算真的很赞!我看到那种效果真的很兴奋呢,旺旺狂闪不停。那种感觉就像拥抱初恋时的悸动。就算是这样的一个忙碌的场景小二也替我们想到了。
感谢小二给我们这么好的一次机会。这次给力的团购活动给我们公司带来了单日销售额的兔飞猛进,相信这是一个崭新而辉煌的开始。
如果说买家在网购的时候能为什么而痴狂,相信那就是优质产品的价格。聚划算这个平台既给了买家最优的产品价格又给了卖家推介自己的平台。完美的促销平台到聚划算来。聚划算;聚的是人气、聚的是财富、聚的是物美价廉。聚划算——最成功的活动策划频道。
活动结束了,如果还有对聚划算不熟悉的亲们,我们就可以坐下来喝着茶聊着天和大家来分享下,
1、活动前选商品,选择一款店铺热销,产品质量,款式都能吸引买家点击购买,还要考虑到选款后适用的人群范围。开团前的准备非常之重要,如果没有参加过的卖家一定要备货充足,客服迅速,快递物流做到充分的准备。
2、活动中报名, 打算报名的商家最好是到聚划算招商入口先进行报名,聚划算开通了CRM报名也可以直接去后台处报名。
http://www.taobao.com/go/act/sale/juhuasuan.php,报上名以后,需要时刻关注聚划算一审通过需要寄样品,这是再等二审通过后就可以上聚划算页面做团购,在这过程中等待是一个“漫长”的过程。
3、活动中客服人员,把客服人员调配充分。客服提前设置好自动回复,把所能料想到得问题全部列出来,找出最好回答方式然后设为自动回复,是比较亲切的语言能使得全给它用上,因为当天的情况客服人员再打字快也不能一个人应对成百上千的咨询买家,而且最新的淘宝旺旺可以自由的设置快捷回复的编号,方便。
4、活动中折扣力度,店铺参加的聚划算活动一定要有超给力的降价幅度,最好在2-5折起,现在的买家比谁都聪明。
5、关联销售,聚划算活动上去以后还可以关联销售相关的产品,单不要
6、售后服务,不要以为做完这一次活动就可以高枕无忧了,以后呢?店还是要发展,活动产品在当天的时候带动了整个店铺的交易量这样很多顾客在买回去以后发现质量挺好没问题,后面就会跟着买,这样一波一波的把潜在的一次顾客转变成回头客,所以做好回访跟踪买家。
此次活动为我店带来的不只是活动期间的收益,更重要的是通过此次活动,提高了消费者对我店及我店商品的认知度和我店的美誉度,此次活动效果全仰仗于聚划算辛勤的小二们细心指导,所以再次感谢聚划算栏目组和各位淘宝小二以及辛苦的数据专员。这次已经不仅仅是一种简短的激励活动,更有着能长期推动我店销售的作用和认识了那么多的聚划算团队的朋友。非常感谢他们。