赞
踩
特点:
这种排序在序列基本有序的情况下效率最好。
在插入排序中我都是用了数组第一个位置做了所谓的哨兵,剩下的数据才是真正用来比较的部分。
特点:仅仅是在直接插入的基础上优化了一下寻找插入位置的算法,采用了折半查找,需要知道的的是无论是什么情况下最后插入的位置都是high+1的位置。
特点:关于希尔排序的过程,另一篇文章有写:https://blog.csdn.net/weixin_44142774/article/details/105738120。
需要注意的是它的时间复杂度是未被计算出来的。而且它是不稳定的算法。
特点:
(1)也和直接插入排序一样,在序列基本有序时效率最好。而且是稳定的排序算法。
(2)每次排序后都会将一个最大或最小的值的位置确定好。
特点:
(1)每一次的快速排序都会确定一个元素的最终位置。
(2)经历一次快排,小于枢轴的元素会被移动到左边,大于枢轴的元素会被移动到右边。
(3)这种排序是不稳定的,例如序列3 2 2‘ ,选择3作为枢轴,则会得到2‘ 2 3,从而使相等的两个元素调换了位置。这种情况有出现在:①开始排序前枢轴的右端区间有两个相等的元素且值小于枢轴②开始排序前枢轴的左端区间有两个相等的元素且值大于枢轴。
(4)这种排序在序列基本有序时的效率最不好,在一般情况下效率是最好的,时间复杂度为(nlog2n)。用到了递归所以需要栈。
(5)每次排序后都会将一个值的位置确定好,但不是最值的位置而是中间值的位置。
特点:
(1)每次排序后都会将一个最大或最小的值的位置确定好。
(2)简单选择排序的效率跟序列的初始状态无关。
(3)这种排序方式是不稳定的。例如序列:2 2’ 1,开始排序后需要将2与1的位置交换,得到1 2’ 2从而破坏了稳定性。
特点:
(1)堆排序调整大根堆的算法是很巧妙的,在每一次的调整中双亲的变化是确定的所以把值写入,至于要调整的值最后放在哪里在调整过程中是不确定的,有可能在孩子中也有可能在孙子中,所以在跳出循环后再将要调整的 值写入恰当的位置。
(2)堆排序的算法是不稳定的,例如序列1 2’ 2,在初始建堆的过程中会变为2’ 1 2,在最后输出交换的过程中2’又放在了最后面即2 1 2’,所以是不稳定的。
(3)堆排序也会在每一次排序后确定一个最值元素的最终位置。
特点:
(1)如图是二路归并排序,我们知道在K路归并排序中归并趟数m与元素数n的关系为:m=logk(n)取上界。
(2)每一趟比较的时间复杂度为O(n)乘以趟数即为总的时间复杂度。
(3)归并排序是稳定的,因为在序列合并时当两个值相等时先并入在前面的那个值。
特点:
(1)唯一一个不基于比较和移动的内部排序方式
(2)基数排序是稳定的。
(3)基数排序的时间复杂度也是不依赖于序列的初始状态的,同简单选择排序是一样的。
#include "stdio.h" #include "malloc.h" void InsertSort (int *a,int n) { int i,j; for (i=2;i<=n;i++) { a[0]=a[i]; for (j=i-1;a[0]<a[j];j--) a[j+1]=a[j]; a[j+1]=a[0]; } } void MidSort(int *a,int n) { int i,j; for(i=2;i<=n;i++) { a[0]=a[i]; int low=1; int high=i-1; int mid; while(low<=high) { mid=(low+high)/2; if(a[0]<a[mid]) { high=mid-1; } else { low=mid+1; } for(j=i-1;j>high+1;j--) { a[j+1]=a[j]; } a[high+1]=a[0]; } } } void ShellSort(int *a,int n) { int dk; int i,j; for(dk=n/2;dk>=1;dk=dk/2) { for(i=1+dk;i<=n;i++) { a[0]=a[i]; for(j=i-dk;j>0&&a[0]<a[j];j=j-dk) { a[j+dk]=a[j]; } a[j+dk]=a[0]; } } } void SwapSort(int *b,int n) { int i,j; int flag; int swap; for (i=0;i<n-1;i++) { flag=0; for (j=n-1;j>i;j--) { if (b[j-1]>b[j]) { swap=b[j-1]; b[j-1]=b[j]; b[j]=swap; flag=1; } } if(flag==0) return; } } int Divide(int *b,int low ,int high) { int pivode; pivode=b[low]; while(low < high) { while((low < high) && (b[high]>=pivode)) high--; b[low]=b[high]; while((low < high) && (b[low]<=pivode)) low++; b[high]=b[low]; } b[low]=pivode; return low; } void QuickSort(int *b,int low,int high) { if (low < high) { int divident; divident = Divide(b,low,high); QuickSort(b,low,divident-1); QuickSort(b,divident+1,high); } } void SelectSort(int *b,int n) { int i,j,min,swap; for (i=0;i<n-1;i++) { min = i; for (j=i+1;j<n;j++) { if(b[j]<b[min]) min=j; } if(min!=i) { swap=b[min]; b[min]=b[i]; b[i]=b[min]; } } } void HeadAdjust(int *a,int k,int len) { int i,j; a[0]=a[k]; for (i=2*k;i<=len;i*=2) { if((i<len)&&(a[i]<a[i+1])) { i++; } if(a[0]>=a[i]) break; else { a[k]=a[i]; k=i; } } a[k]=a[0]; } void HeapCreate(int *a,int len) { int i; for(i=len/2;i>0;i--) { HeadAdjust(a,i,len); } } void HeapSort(int *a,int len) { int i; int swap; HeapCreate(a,len); for(i=len;i>1;i--) { swap=a[i]; a[i]=a[1]; a[1]=swap; HeadAdjust(a,1,i-1); } } void Merge(int *b,int low,int mid,int high) { int *c=(int*)malloc((11)*sizeof(int)); int i,j,k; for(k=low;k<=high;k++) { c[k]=b[k]; } for(i=low,j=mid+1,k=i;(i<=mid) && (j<=high);k++) { if(c[i]<=c[j]) { b[k]=c[i]; i++; } else { b[k]=c[j]; j++; } } if(i<=mid) { b[k++]=c[i++]; } if(j<=high) { b[k++]=c[j++]; } free(c); } void MergeSort(int *b,int low,int high) { int mid; if(low<high) { mid=(low+high)/2; MergeSort(b,low,mid); MergeSort(b,mid+1,high); Merge(b,low,mid,high); } } int main(int argc,char *argv[]) { int a[11]; int b[10]; int i; for(i=1;i<=10;i++) { a[i]=argv[1][i-1]-'0'; } for(i=0;i<10;i++) { b[i]=argv[1][i]-'0'; } printf("array a is:\n"); for (i=1;i<=10;i++) { printf("%d",a[i]); } printf("\n"); printf("array b is:\n"); for (i=0;i<10;i++) { printf("%d",b[i]); } printf("\n"); InsertSort(a,10); printf("InsertSort a is:\n"); for (i=1;i<=10;i++) { printf("%d",a[i]); } printf("\n"); MidSort(a,10); printf("MidSort a is:\n"); for (i=1;i<=10;i++) { printf("%d",a[i]); } printf("\n"); ShellSort(a,10); printf("ShellSort a is:\n"); for (i=1;i<=10;i++) { printf("%d",a[i]); } printf("\n"); SwapSort(b,10); printf("SwapSort b is:\n"); for (i=0;i<10;i++) { printf("%d",b[i]); } printf("\n"); QuickSort(b,0,9); printf("QuickSort b is:\n"); for (i=0;i<10;i++) { printf("%d",b[i]); } printf("\n"); SelectSort(b,10); printf("SelectSort b is:\n"); for (i=0;i<10;i++) { printf("%d",b[i]); } printf("\n"); HeapSort(a,10); printf("HeapSort a is:\n"); for (i=1;i<=10;i++) { printf("%d",a[i]); } printf("\n"); MergeSort(b,0,10); printf("MergeSort b is:\n"); for (i=0;i<10;i++) { printf("%d",b[i]); } printf("\n"); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。