各个排序算法及其代码

  • 格式:doc
  • 大小:55.50 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
O(d(n+r))
O(d(n+r))
O(n+r)
稳定的
void shell_sort(int s[],int n)
{//希尔
int d=0;
int i,j,temp;
for(d=n/2;d>=1;d/=2)
{
for(i=d;i<n;i++)
{
temp=s[i];
j=i-d;
while(j>=0&&s[j]>temp)
{
s[j+d]=s[j];
j=j-d;
O(1)
稳定的
Shell排序
O(n1.3)
O(1)
不稳定的
直接选择
O(n2)
O(n2)
O(1)
不稳定的
堆排序
O(n㏒2n)
O(n㏒2n)
O(1)
不稳定的
冒泡排序
O(n2)
O(n2)
O(1)
稳定的
快速排序
O(n㏒2n)
O(n2)
O(㏒2n)Leabharlann Baidu
不稳定的
归并排序
O(n㏒2n)
O(n㏒2n)
O(n)
稳定的
基数排序
flag=false;
}
}
if(flag==true)
break;
}
}
常见排序算法的实现(五)→快速排序
快速排序的算法思想: 选定一个枢纽元素,对待排序序列进行分割,分割之后的序列一个部分小于枢纽元素,一个部分大于枢纽元素,再对这两个分割好的子序列进行上述的过程。
//对一个给定范围的子序列选定一个枢纽元素,执行完函数之后返回分割元素所在的位置,
{
int mid;
if(low<high)
{
mid=(low+high)/2;
merge_sort(s,low,mid);
merge_sort(s,mid+1,high);
merge(s,low,mid,high);
}
}
排序算法---堆排序
方法
平均时间
最坏所需时间
附加空间
稳定性
直接插入
O(n2)
O(n2)
j--;
}
s[j+1]=temp;
}
}
常见排序算法的实现(二)→shell排序
shell排序是对插入排序的一个改装,它每次排序把序列的元素按照某个增量分成几个子序列,对这几个子序列进行插入排序,然后不断缩小增量扩大每个子序列的元素数量,直到增量为一的时候子序列就和原先的待排列序列一样了,此时只需要做少量的比较和移动就可以完成对序列的排序了。[详细内容]
归并排序的算法思想:把待排序序列分成相同大小的两个部分,依次对这两部分进行归并排序,完毕之后再按照顺序进行合并。
void merge(int s[],int low,int m,int high)
{
int i,j,k=0;
int t[100];
for(i=low,j=m+1;i<=m&&j<=high;)
1 + 2 + 3 + …… + N = O(N ^ 2)的复杂度。[详细内容]
void insert_sort(int s[],int n)
{
int i,j,temp;
for(i=1;i<n;i++)
{
temp=s[i];
j=i-1;
while(j>=0&&s[j]>temp)
{
s[j+1]=s[j];
}
void quick_sort(int s[],int low,int high)
{
int n;
if(low<high)
{
n=partition(s,low,high);
quick_sort(s,low,n-1);
quick_sort(s,n+1,high);
}
}
常见排序算法的实现(六)→归并排序
}
-----此处可以加if(low<high)
temp=s[high];
s[high]=s[low];
s[low]=temp;
while(low<high&&s[low]<=pivo)
{
low++;
}
temp=s[high];
s[high]=s[low];
s[low]=temp;
}
return high;
}
s[j+d]=temp;
}
}
}
常见排序算法的实现(四)→冒泡排序
冒泡排序算法的思想:很简单,每次遍历完序列都把最大(小)的元素放在最前面,然后再对剩下的序列从父前面的一个过程,每次遍历完之后待排序序列就少一个元素,当待排序序列减小为只有一个元素的时候排序就结束了。因此,复杂度在最坏的情况下是O(N ^ 2)。
//在分割元素之前的元素都小于枢纽元素,在它后面的元素都大于这个元素
int partition(int s[],int low,int high)
{
int temp;
int pivo=s[low];
while(low<high)
{
while(low<high&&s[high]>=pivo)
{
high--;
常见排序算法的实现(一)→插入排序
插入排序是最简单最直观的排序算法了,它的依据是:遍历到第N个元素的时候前面的N-1个元素已经是排序好的了,那么就查找前面的N-1个元素把这第N个元素放在合适的位置,如此下去直到遍历完序列的元素为止。
算法的复杂度也是简单的,排序第一个需要1的复杂度,排序第二个需要2的复杂度,因此整个的复杂度就是
void bubble_sort(int s[],int n)
{
int i,j;
int temp;
bool flag;
for(i=n-1;i>=1;i--)
{
flag=true;
for(j=0;j<i;j++)
{
if(s[j]>s[j+1])
{
temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
{
if(s[i]<=s[j])
{
t[k++]=s[i++];
}
else
{
t[k++]=s[j++];
}
}
while(i<=m)
t[k++]=s[i++];
while(j<=high)
t[k++]=s[j++];
for(i=low,j=0;j<k;i++,j++)
s[i]=t[j];
}
void merge_sort(int s[],int low,int high)