日常说明:有错误欢迎大家指正。另外本博客所有的代码博主编写后均调试通过。重要提醒!!!!博主使用的是VS2017,如果有低版本的小伙伴最好新建空项目将此代码复制上去。
更多算法请关注我的算法专栏https://blog.youkuaiyun.com/column/details/20417.html
有朋友反映让我多加备注,我觉得除非特别惊艳的方法需要说明外,这些基本的方法是容易明白的,当然前提是先搞懂算法的基本思想,希望对你们有用。
一、冒泡排序
算法思想:冒泡排序也成为起泡排序(Bubble Sort),过程很简单。用冒泡排序的方法将一个数字序列的步骤:第一个关键字与第二个关键字比较大小,如果第一个关键词大于第二个,那么交换两者的位置。较大的关键字继续和之后的关键字比较,依次类推,一趟一趟的进行,直到将序列按非递减排序为止。其实就是每一趟将最大的关键词找出来,类似于水中的气泡向上漂浮。
如 :
49 38 65 97 76 13 27
第一趟后:38 49 65 76 13 27 97(最大的为97)
第二趟后:38 49 65 13 27 76(最大76)
第三趟后:38 49 13 27 65(最大65)
第四趟:38 13 27 49 (最大49)
第五趟:12 27 38
至此排序完成:12 27 38 49 65 76 97
冒泡排序的时间复杂度O(n^2)
核心代码:
for(i=0;i<L.length-1;i++)
{
if(L[i]<L[i+1])
{
swap(L[i],L[i+1]); //简单的交换函数
}
}
二、快速排序
算法思想:快速排序是对冒泡排序的一种简单改进,效率却大大提高。具体的做法是:
首先确定一个枢轴值,一般是选择序列的第一个关键字。分别从两端将关键词和枢轴值进行比较,比枢轴值小的放在枢轴值左侧,比枢轴值大的放在枢轴值右侧。这样一趟下来就将序列分为两个子序列,再分别对两个子序列进行同样的划分,直至排序完成。
如:
49 38 65 97 76 13 27
第一次划分:27 38 13 49 76 65 97
两个子序列分别进行快速排序:
13 27 38(子序列一趟排序完成)
65 76 97 (排序一趟完成)
即:13 27 38 49 65 76 97
核心代码:
int partition(Sqlist&L,int low,int high)
{
L[0] = L[low];//L[0]用来存储枢轴值,即将第一个关键字L[low]赋值给L[0]
key = L[low];//枢轴关键字
while(low<high)
{
while(low<high&&L[high]>=key)
{--high};
L[low] = L[high];
while(low<high&&L[low]<=key)
{++low};
L[high]=L[low];
}
L[low]=L[high];
return low;
}
int Qsort(Sqlist&L,int low,int high)
{
if(low<high)
{
temp = partition(L,low,high);
Qsort(L,low,temp-1);
Qsort(L,temp+1,high);
}
}