一些常用的排序算法(C版)

Posted program_Li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些常用的排序算法(C版)相关的知识,希望对你有一定的参考价值。

1. 直接插入排序(稳定排序)

简单的说就是将序列分为有序序列和无序序列。每一趟排序都是将无序序列的第一个元素插入有序序列中。R[1… i-1] <- R[i…n] , 每次取R[i]插入到R[1… i-1]中。

步骤如下:

1> 在R[1 … i-1]中找到R[i]的插入位置k (0<k<i)

2> 将R[k … i-1]均后移一位,K位置上插入R[i]

改进版:

1> 在R[1 … i-1]中将R[i]从右向左一一比较,R[j] >R[i],则R[j]后移一位(j = i-1开始)

2> 如果R[j] <=R[i],则j+1 为R[i]的插入位置

 1 #include<stdio.h>
 2 void insert_sort(int a[],int len)
 3 {
 4     int i=0,j=0,temp=0;
 5     for(i=1;i<len;i++)
 6     {
 7         temp =a[i];
 8         for(j=i-1;j>=0&&temp<a[j];j--)
 9         {
10             a[j+1]=a[j];
11         }
12         a[j+1]=temp;
13     }
14 }
15 
16 void print_array(int a[],int len)
17 {
18     for(int i=0;i<len;i++)
19     {
20         printf("a[%d] = %d\\n",i ,a[i]);
21     }
22     printf("\\n");
23 }
24 
25 
26 int main()
27 {
28  int a[]={1,2,7,8,10,4,54,82,23} ;
29  printf("before sort\\n");
30  print_array(a,sizeof(a)/sizeof(a[0]));
31  insert_sort(a,sizeof(a)/sizeof(a[0]));
32  printf("after sort\\n");
33  print_array(a,sizeof(a)/sizeof(a[0]));
34  return 0;
35 }

2. 冒泡排序(稳定排序)

冒泡排序也叫起泡排序,顾名思义,就是每一趟,从左到右,两两比较,大的(小的)后移,最后最轻的气泡到最后的位置R[i],为最大或最小值,然后下一趟,选出次大的到R[i-1],以此,到最后R[1],至此全部有序。(按照递增递减都可以)

 1 #include<stdio.h>
 2 
 3 /* ...a[n] ,从a[0]最小开始,*/
 4 void bubble_sort_S2B(int a[],int len)
 5 {
 6     int i,j,temp;
 7     for(i=0;i<len-1;i++)
 8     {
 9         for(j=0;j<len-i-1;j++)
10         {
11             if(a[j+1]<a[j])
12             {
13                 temp=a[j];
14                 a[j]=a[j+1];
15                 a[j+1]=temp;
16             }
17         }
18     }
19 }
20 void bubble_sort_B2S(int a[],int len)
21 {
22     int i,j,temp;
23     for(i=0;i<len-1;i++)
24     {
25         for(j=0;j<len-i-1;j++)
26         {
27             if(a[j+1]>a[j])
28             {
29                 temp=a[j];
30                 a[j]=a[j+1];
31                 a[j+1]=temp;
32             }
33         }
34     }
35 }
36 
37 
38 void print_array(int a[],int len)
39 {
40     for(int i=0;i<len;i++)
41     {
42         printf("a[%d] = %d\\n",i ,a[i]);
43     }
44     printf("\\n");
45 }
46 
47 
48 int main()
49 {
50  int a[]={1,2,7,8,10,4,54,82,23} ;
51  printf("before sort\\n");
52  print_array(a,sizeof(a)/sizeof(a[0]));
53  bubble_sort_B2S(a,sizeof(a)/sizeof(a[0]));
54  printf("after sort\\n");
55  print_array(a,sizeof(a)/sizeof(a[0]));
56  return 0;
57 }

 

以上是关于一些常用的排序算法(C版)的主要内容,如果未能解决你的问题,请参考以下文章

图解算法系列之冒泡排序(优化版)

图解算法系列之冒泡排序(Low版)

图解算法系列之插入排序(Low版)

Java排序算法 - 堆排序的代码

图解算法系列之插入排序(优化版)

六种排序算法C语言版(上)