• 数据算法--7.2.2排序算法


    一、希尔排序

    基本有序

    1. #include
    2. void InsertSort(int k[],int n)
    3. {
    4. int i,j,temp;
    5. int gap = n;
    6. do
    7. {
    8. gap = gap/3+1;
    9. for(i=gap;i
    10. {
    11. if(k[i]
    12. {
    13. temp = k[i];
    14. for(j=i-gap;k[j]>temp;j-=gap)
    15. {
    16. k[j+gap] = k[j];
    17. }
    18. k[j+gap] = temp;
    19. }
    20. }
    21. }while(gap>1);
    22. }
    23. int main()
    24. {
    25. int i,a[10]= {5,2,6,0,3,9,1,7,4,8};
    26. InsertSort(a,10);
    27. printf("排序后的结果是:\n");
    28. for(i=0;i<10;i++)
    29. {
    30. printf("%d\t",a[i]);
    31. }
    32. printf("\n\n");
    33. return 0;
    34. }

    二、堆排序

            根结点一定是堆中所有结点最大或者最小者,如果按照层序遍历的方式给结点从1开始编号,则结点之间满足如下关系:

    Ki>=K2i   ,   Ki>=K2i+1    或     Ki< = K2i       Ki<= K2i+1       ( i< = i<=[n/2])

    .  下标i 与 2i  和2i+1 是双亲和子女关系

    .   那么把大顶堆和小顶堆用层序遍历存入数组,则一定满足上面的表达式。

    堆排序(Heap Sort)就是利用堆进行排序的算法,它的基本思想是:

    ——将待排序的序列构造成一个大顶堆(或小顶堆)。

    ——此时,整个序列的最大值就是堆顶的根结点。将它移走(就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值)。

    ——然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值。

    ——如此反复执行,便能得到一个有序序列。

    1. #include
    2. void swap(int k[],int i,int j)
    3. {
    4. int temp;
    5. temp = k[i];
    6. k[i] = k[j];
    7. k[j] = temp;
    8. }
    9. void HeapAdjust(int k[],int s,int n)
    10. {
    11. int i,temp;
    12. temp = k[s];
    13. for(i=2*s;i<=n;i*=2)
    14. {
    15. if(i < n && k[i] < k[i+1])
    16. {
    17. i++;
    18. }
    19. if(temp >= k[i])
    20. {
    21. break;
    22. }
    23. k[s] = k[i];
    24. s = i;
    25. }
    26. k[s] = temp;
    27. }
    28. void HeapSort(int k[], int n)
    29. {
    30. int i;
    31. for(i = n/2;i>0;i--)
    32. {
    33. HeapAdjust(k,i,n);
    34. }
    35. for(i= n;i>1;i--)
    36. {
    37. swap(k,1,i);
    38. HeapAdjust(k,1,i-1);
    39. }
    40. }
    41. int main()
    42. {
    43. int i,a[10]= {5,2,6,0,3,9,1,7,4,8};
    44. HeapSort(a,10);
    45. printf("排序后的结果是:\n");
    46. for(i=0;i<10;i++)
    47. {
    48. printf("%d\t",a[i]);
    49. }
    50. printf("\n\n");
    51. return 0;
    52. }

     三、归并排序

    归并排序(Merge Sort)就是利用归并的思想实现的排序方法。它的原理是假设初始序列有n个记录,则可以看成是n个记录,则可以看成n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序子序列;依次往复。

    1. #include
    2. #define MAXSIZE 10
    3. void merging(int *list1,int list1_size, int *list2,int list2_size)
    4. {
    5. int j,k,i;
    6. int temp[MAXSIZE];
    7. i = j = k = 0;
    8. while( i< list1_size && j < list2_size)
    9. {
    10. if(list1[i]
    11. {
    12. temp[k++] = list1[i++];
    13. }
    14. else
    15. {
    16. temp[k++] = list2[j++];
    17. }
    18. }
    19. while(i < list1_size)
    20. {
    21. temp[k++] = list1[i++];
    22. }
    23. while(j < list2_size)
    24. {
    25. temp[k++] = list2[j++];
    26. }
    27. for(int m =0;m < (list1_size + list2_size);m++)
    28. {
    29. list1[m] = temp[m];
    30. }
    31. }
    32. void MergeSort(int k[],int n)
    33. {
    34. if(n>1)
    35. {
    36. int *list1 = k;
    37. int list1_size = n/2;
    38. int *list2 = k + n/2;
    39. int list2_size = n - list1_size;
    40. MergeSort(list1,list1_size);
    41. MergeSort(list2,list2_size);
    42. merging(list1,list1_size,list2,list2_size);
    43. }
    44. }
    45. int main()
    46. {
    47. int i,a[10]={5,2,6,0,3,9,1,7,4,8};
    48. MergeSort(a,10);
    49. printf("排序后的结果:\n");
    50. for(i=0;i<10;i++)
    51. {
    52. printf("%d\t",a[i]);
    53. }
    54. printf("\n\n");
    55. return 0;
    56. }

    三、快速排序

    1. #include
    2. void swap(int k[],int low,int high)
    3. {
    4. int temp;
    5. temp = k[low];
    6. k[low] = k[high];
    7. k[high] = temp;
    8. }
    9. int Partition(int k[],int low,int high)
    10. {
    11. int point;
    12. point = k[low];
    13. while(low < high)
    14. {
    15. while(low < high && k[high] >= point)
    16. {
    17. high--;
    18. }
    19. while(low < high && k[low] <= point)
    20. {
    21. low++;
    22. }
    23. }
    24. }
    25. void Qsort(int k[],int low,int high)
    26. {
    27. int point;
    28. if(low < high)
    29. {
    30. point = Partition(k,low,high);
    31. Qsort(k,low,point - 1);
    32. Qsort(k,point+1,high);
    33. }
    34. }
    35. void QuickSort(int k[],int n)
    36. {
    37. Qsort(k,0,n-1);
    38. }
    39. int main()
    40. {
    41. int i,a[10] = {5,2,6,8,3,9,1,7,4,8};\
    42. QuickSort(a,10);
    43. printf("排序后的结果:");
    44. for(i=0;i<10;i++)
    45. {
    46. printf("%d",a[i]);
    47. }
    48. printf("\n\n");
    49. return 0;
    50. }

  • 相关阅读:
    JAVA String 和 String[][]互转的两种方法
    植物大战僵尸机枪射手怎么发出多枚子弹
    计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序
    万字文章|JDK动态代理及其源码解析 拿捏了
    论文发表需要的重复率是多少?
    基于C语言开发实现的一个用户级线程库
    最终版本-在 CentOS 8 中添加永久路由
    文本处理三剑客之 sed 流编辑器(基础部分)
    HTTP、HTTPS协议详解
    嵌入式Linux driver开发实操(二十二):写一个ALSA驱动程序
  • 原文地址:https://blog.csdn.net/ww1425408527/article/details/132873603