数据结构中常用排序算法

排序常用的算法有:插入算法(直接插入算法、折半插入算法、希尔算法)、选择算法(简单选择算法、堆排序算法)、快速算法(冒泡排序、快速排序算法)

以下程序给出了各种算法的实现,其接口为void sort(int *array,int len),每个文件实现一个算法, 最后和main.c文件编译实现。

1、直接插入算法:

//direct_insert_sort.c

[cpp] view plaincopy

  1. void sort(int *array,int len)
  2. {
  3. int tmp,i,j;
  4. for(i=1;i<len;i++)
  5. {
  6. if(array[i]<array[i-1])
  7. {
  8. tmp = array[i];
  9. for(j=i-1;j>=0;j--)
  10. {
  11. if(array[j]>tmp)
  12. array[j+1]=array[j];
  13. else
  14. break;
  15. }
  16. array[j+1]=tmp;
  17. }
  18. }
  19. }

2、折半插入排序

//binary_insert_sort.c

[cpp] view plaincopy

  1. void sort(int *array,int len)
  2. {
  3. int low,m,high;
  4. int i,tmp,j;
  5. for(i=1;i<len;i++)
  6. {
  7. if(array[i]<array[i-1])
  8. {
  9. tmp = array[i];
  10. low = 0;
  11. high = i-1;
  12. while(low <= high)
  13. {
  14. m=(low+high)/2;
  15. if(array[m]>=tmp)
  16. high = m-1;
  17. else
  18. low = m +1;
  19. }
  20. for(j=i-1;j>=low;j--)
  21. {
  22. array[j+1]=array[j];
  23. }
  24. array[low]=tmp;
  25. }
  26. }
  27. }

3、希尔排序

//shell_sort.c

[cpp] view plaincopy

  1. void sort(int *array,int len)
  2. {
  3. int tmp,i,j,gap;
  4. gap = len ;
  5. do
  6. {
  7. gap = gap / 3 + 1;
  8. for(i=0+gap;i<len;i++)
  9. {
  10. if(array[i]<array[i-gap])
  11. {
  12. tmp = array[i];
  13. for(j=i-gap;j>=0;j=j-gap)
  14. if(array[j]>tmp)
  15. array[j+gap]=array[j];
  16. else
  17. break;
  18. array[j+gap]=tmp;
  19. }
  20. }
  21. }while(gap > 1);
  22. }

4、简单选择排序

//simple_select_sort

[cpp] view plaincopy

  1. void sort(int *array,int len)
  2. {
  3. int i,j,min,tmp;
  4. for(i=0;i<len-1;i++)
  5. {
  6. min= i;
  7. for(j=i+1;j<len;j++)
  8. if(array[j]<array[min])
  9. min=j;
  10. if(i != min)
  11. {
  12. tmp=array[i];
  13. array[i]=array[min];
  14. array[min]=tmp;
  15. }
  16. }
  17. }

5、堆排序

//heap_sort.c

[cpp] view plaincopy

  1. static void heapAdjust(int * array,int start,int end);
  2. void sort(int *array,int len)
  3. {
  4. int i,j;
  5. for(i=len/2;i>=0;i--)
  6. heapAdjust(array,i,len-1);
  7. for(i=len-1;i>0;i--)
  8. {
  9. int tmp=array[i];
  10. array[i]=array[0];
  11. array[0]=tmp;
  12. heapAdjust(array,0,i-1);
  13. }
  14. }
  15. static void heapAdjust(int * array,int start,int end)
  16. {
  17. int i;
  18. int tmp = array[start];
  19. for(i=2*start+1;i<=end;i=2*i+1)
  20. {
  21. if(array[i]<array[i+1]&& i<end)
  22. i++;
  23. if(tmp > array[i])
  24. break;
  25. array[start]=array[i];
  26. start = i;
  27. }
  28. array[start]=tmp;
  29. }

6、冒泡排序

//bubble_sort.c

[cpp] view plaincopy

  1. void sort(int * array,int len)
  2. {
  3. int i,j,tmp;
  4. for(i=1;i<len;i++)
  5. {
  6. for(j=0;j<len-1;j++)
  7. if(array[j]>array[j+1])
  8. {
  9. tmp = array[j+1];
  10. array[j+1]=array[j];
  11. array[j]=tmp;
  12. }
  13. }
  14. }

7、快速排序

//quick_sort.c

[cpp] view plaincopy

  1. static int partition(int *array,int low,int high);
  2. static void quickSort(int *array,int start,int end);
  3. void sort(int *array,int len)
  4. {
  5. quickSort(array,0,len-1);
  6. }
  7. static void quickSort(int *array,int start,int end)
  8. {
  9. if(start < end)
  10. {
  11. int pivotloc = partition(array,start,end);
  12. quickSort(array,start,pivotloc-1);
  13. quickSort(array,pivotloc+1,end);
  14. }
  15. }
  16. static int partition(int *array,int low,int high)
  17. {
  18. int i,j,tmp;
  19. tmp = array[low];
  20. while(low < high)
  21. {
  22. while(low<high && array[high]>tmp)
  23. high--;
  24. array[low]=array[high];
  25. while(low<high && array[low]<tmp)
  26. low++;
  27. array[high]=array[low];
  28. }
  29. array[low]=tmp;
  30. return low;
  31. }

8、主函数main.c 上面的文件分别单独和main.c文件一起编译即可生成目标文件

[cpp] view plaincopy

  1. #include<stdio.h>
  2. extern void sort(int *array,int len);
  3. void print(const int *array,int len)
  4. {
  5. int i;
  6. for(i=0;i<5;i++)
  7. printf("%d    ",array[i]);
  8. putchar(‘\n‘);
  9. }
  10. int main()
  11. {
  12. int i;
  13. printf("please input 5 integer numbers\n");
  14. int array[5];
  15. fflush(stdin);
  16. for(i=0;i<5;i++)
  17. scanf("%d",array+i);
  18. printf("\nold order is:\n");
  19. print(array,5);
  20. sort(array,5);
  21. printf("\n new order is:\n");
  22. print(array,5);
  23. }
				
时间: 2024-10-10 15:30:50

数据结构中常用排序算法的相关文章

数据结构中的排序算法总结

数据结构中的排序算法 当待排序序列基本有序时优先选择简单排序,快速排序平均次数少于堆排序 1   插入排序 1)  直接插入排序 第一次将位置0和位置1进行比较,小的放前. 第二次将位置2上的数字,插入到位置0和位置1中. - 第k次将位置k上的数字,插入到第k-1次已经完成的序列中. 5 2 6 0 3 9 1 7 4 8 一趟 2 5 6 0 3 9 1 7 4 8 二趟 2 5 6 0 3 9 1 7 4 8 三趟 0 2 5 6 3 9 1 7 4 8 四趟 0 2 3 5 6 9 1

数据结构中的排序算法

上一篇介绍了冒泡排序,现在介绍一下其他的排序算法 各种排序的稳定性,时间复杂度和空间复杂度总结: 3.选择排序 直接选择排序算法的思想比较简单:(假设数据放在一个数组a中,且数组的长度是N) 1:从a[0]-a[N-1]中选出最小的数据,然后与a[0]交换位置 2:从a[1]-a[N-1]中选出最小的数据,然后与a[1]交换位置(第1步结束后a[0]就是N个数的最小值) 3:从a[2]-a[N-1]中选出最小的数据,然后与a[2]交换位置(第2步结束后a[1]就是N-1个数的最小值) 以此类推,

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排

常用排序算法实现[交换排序之冒泡排序、快速排序]

相关知识 1. 稳定排序和非稳定排序: 稳定排序算法会依照相等的关键(换言之就是值)维持纪录的相对次序. 如果排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前. 2. 内排序和外排序 在排序过程中,所有需要排序的数都在内存,并在内存中调整它们的存储顺序,称为内排序: 在排序过程中,只有部分数被调入内存,并借助内存调整数在外存中的存放顺序排序方法称为外排序. 3.算法分类 排序算法从理论上分为如下几类: (1) 交换排序法:

视觉直观感受7种常用排序算法

视觉直观感受若干常用排序算法 1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性. 步骤: 从数列中挑出一个元素,称为 "基准"(pivo

数据结构中常用树型结构简介

B树.B-树.B+树.B*树.红黑树rbtree 二叉排序树.trie树Double Array 字典查找树 B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中:否则,如果查询关键字比结点关键字小,就进入左儿子:如果比结点关键字大,就进入右儿子:如果左儿子或右儿子的指针为空,则报

几种常用排序算法的python实现

1:快速排序 思想: 任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序. 一趟快速排序的算法是: 1)设置两个变量i.j,排序开始的时候:i=0,j=N-1: 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]: 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]赋给A[i]: 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大

几种常用排序算法 (一)

八大常用排序算法详细分析 包括复杂度: 排序有可以分为以下几类: (1).交换排序:冒泡排序.快速排序 (2).选择排序:直接选择排序.堆排序 (3).插入排序:直接插入排序.希尔排序 (4).归并排序 (5).基数排序(桶排序) 1.冒泡排序 顾名思义,冒泡排序就是用气泡从下往上冒的原理,将气泡(较小或较大的数)依次往前移. 具体做法(升序):设总共有N个元素,则至少需要进行N-1次冒泡.一次排序排序中,若前一个元素大于后一个元素,则交换两个元素,然后在依次判  断后面两两相邻元素大小并进行交

常用排序算法的python实现

排序算是编程最基本的算法问题之一了,熟练掌握排序算法也能加深自己对数据结构的理解,也能提高自己的编程能力,以下为个人参考许多大神博客后对常用排序算法的学习总结. 目录: 概述 冒泡排序 直接插入排序 简单选择排序 希尔排序 堆排序 归并排序 快速排序 算法的比较与测试 参考 1. 概述 所谓排序(sorting)就是整理数据的序列,使其按照特定顺序排列的操作.排序在现实生活中(如整理书籍,表格数据等),在计算领域中(如二分查找,图论的最小生成树的Kruskal算法)均有重要意义,所以一种高效的排