排序算法

来源:互联网 发布:js监听手机输入法关闭 编辑:程序博客网 时间:2024/05/01 23:34

 1、常用的排序算法的时间复杂度和空间复杂度

 2、关于常见排序算法的稳定性分析和结论 

    1)稳定性通俗地讲就是能保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同。在简单形式化一下,如果Ai = Aj, Ai原来在位置前,排序后Ai还是要在Aj位置前。

    2)选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法

3、几种排序算法的最简单实现方式

//冒泡排序/*思想:两两比较相邻记录的关键码,如果反序则交换,    直到没有反序的记录为止*/void BubbleSort(int *a, int n){int i,j;int x;for(i=1;i<n;i++) {   for(j=0;j<n-i;j++) //找到一组中最大的{ if(a[j]>a[j+1]) {  //进行交换x  = a[j];a[j] = a[j+1];a[j+1] = x;   }}}}//直接插入排序:/*思想:依次将待排序序列中地每一个记录插入到     一个已排好的序列中,直到全部记录排好序*/void InsertSort(int *a,int n){int i,j,temp;for( i=1; i<n; i++){   temp = a[i];     //设置哨兵   for(j=i-1; temp<a[j]; j--)   //寻找插入位置   {   a[j+1] = a[j];    // 记录后以   }   a[j+1] = temp;    //插入数据}}//选择排序/*思想:第i趟排序通过n-i次关键码的比较,  在n-i+1个记录中选择关键码最小的记录,并和第i个记录交换作为有序序列的第i个记录*/void SelectSort(int *a,int n){int i, j, temp;int index;for( i=0;  i<n-1;  i++){index=i;       //记录第i趟的最小值标号for( j=i; j<n; j++){if(a[j]<a[index])index = j;}temp = a[i];a[i] = a[index];a[index] = temp;}}//折半插入排序void Insert_halfSort(int *a,int n){int low,high,mid,temp;for(int i=1; i<n;i++)  //依次插入数据{temp = a[i];low = 0;high = i-1;    while(low <= high) //找到该插入的地方{      mid = (low+high)/2;      if(a[i] <= a[mid])       high = mid-1;  else   low = mid+1;}for(int j=i-1; j>=high+1;  j--)  //找到插入位置{   a[j+1]=a[j];}a[high+1] = temp;}}//希尔排序//将待排序列划分为若干组,在每组内进行直接插入排序,//以使整个序列基本有序,然后再对整个序列进行直接插入排序void Shell_Sort(int *a,int n){int i,j,gap,temp;for(gap=n/2; gap>0; gap /=2)  //分组{for(i=gap; i<n; i++)  //组内排序{for(j=i-gap; j>=0; j--){if(a[j]>a[j+gap]){temp = a[j];a[j] = a[j+gap];a[j+gap] = temp;}}}}/*while(gap>0){for(i=gap; i<n; i++){for(j=i-gap; j>=0; j--){if(a[j]>a[j+gap]){temp=a[j];a[j] = a[j+gap];a[j+gap] = temp;}}}gap = gap/2;}*/}

 

原创粉丝点击