Time : 2020-08-03 12:48:37
本文主要总结了C语言常见的四种排序算法:
冒泡排序、插入排序、选择排序、快速排序。
冒泡排序:
主要思想:将一串数字中的最大值(或最小值)排列到数组的最后面,再将内层循环j的最大值向前移一位;
同理,这个时候将剩余数字的最大值(或最小值)冒泡到数组的倒数第二个位置,内层循环j的最大值向前移一位。
知道内层循环结束,整个排序也完成了。
时间复杂度为O(n2)。
代码如下:
1 #include<stdio.h>
2 int main()
3 {
4 int array[100] = {0};
5 int sum = 0;
6 printf("Bubble sort algorithm:(enter q to quit)\n\n\n");
7 while(1)
8 {
9 int i = 0, j = 0;
10 printf("Please enter the sum of your numbers:\n");
11 if(scanf("%d", &sum) != 1)
12 break;
13
14
15 printf("Please input your numbers:\n");
16
17 for(i = 0;i<sum;i++)
18 scanf("%d", &array[i]);
19
20 for(i = 0;i<sum - 1;i++)
21 {
22 for(j = 0;j< sum - i - 1;j++)
23 {
24 if(array[j] > array[j+1])
25 {
26 int temp = array[j];
27 array[j] = array[j+1];
28 array[j+1] = temp;
29 }
30 }
31 }
32
33 //array output
34 printf("\aThe sorted numbers are listed below: \n");
35 for(i = 0;i<sum;i++)
36 printf("%d ", array[i]);
37
38 printf("\n");
39 }
40
41 return 0;
42 }
插入排序:
插入排序类似于扑克牌的摸牌过程:
假设你手里已经摸了一张牌,你再摸了一张,这个时候你需要把第二张牌与原来的一张比较,如果第二张比第一张要小,则将第二张放到第一张的左面;
当你摸第三张的时候,你需要将第三张依次与新的第一张和第二张比较并根据要求交换位置;
……
直到摸牌结束。
时间复杂度为O(n2)。
1 #include<stdio.h>
2 int main()
3 {
4 int array[100] = {0}, sum = 0;
5 printf("Insertion sort algorithm:(enter q to quit)\n\n\n");
6 while(1)
7 {
8 int i = 0, j = 0;
9 printf("Please enter the sum of your numbers:\n");
10 if(scanf("%d", &sum) != 1)
11 break;
12 printf("Please input your numbers:\n");
13 for(i = 0;i<sum;i++)
14 scanf("%d", &array[i]);
15
16 //核心算法
17 for(i =1 ;i < sum;i++)
18 for(j = i;j > 0; j--)
19 {
20 if(array[j] < array[j -1])
21 {
22 int temp = array[j];
23 array[j] = array[j-1];
24 array[j-1] = temp;
25 }
26 }
27
28 //array output
29 printf("\aThe sorted numbers are listed below: \n");
30 for(i = 0;i<sum; i++)
31 printf("%d ", array[i]);
32 printf("\n");
33 }
34 return 0;
35 }
选择排序:
选择排序就是从一串数字当中选择出最小值(或最大值),将这个最小值(或最大值)排在首位,之后对于剩余的数字进行同样的操作即可。
时间复杂度为O(n2)。
1 #include<stdio.h>
2 int main()
3 {
4 int array[100] = {0};
5
6 int sum = 0;
7 printf("selection sort algorithm:(enter q to quit)\n\n\n");
8 while(1)
9 {
10 int i = 0, j = 0, min =0;
11 printf("Please enter the sum of your numbers:\n");
12 if(scanf("%d", &sum) != 1)
13 break;
14
15 printf("Please input your numbers:\n");
16 for(i = 0;i<sum;i++)
17 scanf("%d", &array[i]);
18
19
20 for(i = 0;i<sum;i++)
21 {
22 min = i;
23 for(j = i;j<sum;j++)
24 if(array[min] > array[j])
25 min = j;
26
27 //exchange array[i] and minimum element of remaining numbers
28 int temp = array[min];
29 array[min] = array[i];
30 array[i] = temp;
31 }
32
33
34 //array output
35 printf("\aThe sorted numbers are listed below: \n");
36 for(i = 0;i<sum;i++)
37 printf("%d ", array[i]);
38 printf("\n\n");
39 }
40
41 return 0;
42 }
快速排序:
设要排序的数组是s[0]……s[sum-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它左边,所有比它大的数都放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=sum-1;
2)以第一个数组元素作为关键数据,赋值给std,即std=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于std的值s[j],将s[j]和s[i]的值交换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于std的s[i],将s[i]和s[j]的值交换;
5)重复第3、4步,直到i=j;
注意:
3,4步中,如果没找到符合条件的值,即3中s[j]不小于std,4中s[i]不大于std的时候只需要改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束。
时间复杂度为O(nlog2n),因此快速排序是一种比较高效的算法。
1 #include<stdio.h>
2 void quicksort(int s[], int left, int right);
3 void quicksort(int s[], int left, int right)
4 {
5 if(left < right)
6 {
7 int i = left, j = right, std = s[i];//std is the basic num
8 while(i < j)
9 {
10 while(i < j &&s[j] > std) //right to left
11 j--;
12 if(i < j &&s[j] <= std)
13 s[i++] = s[j];
14
15 while(i < j&& s[i] < std) //left to right
16 i++;
17 if(i < j && s[i] >= std)
18 s[j--] = s[i];
19 }
20 s[i] = std;
21 quicksort(s, left, i - 1);
22 quicksort(s, i+1, right);
23 }
24
25 }
26 int main()
27 {
28 int array[100] = {0};
29 int sum = 0;
30 printf("Quick sort algorithm:(enter q to quit)\n\n\n");
31
32 while(1)
33 {
34 printf("Please enter the sum of your numbers:\n");
35
36 if(scanf("%d", &sum) != 1) break;
37 printf("Please input your numbers:\n");
38
39 for(int i = 0;i < sum;i++)
40 scanf("%d", &array[i]);
41 int left = 0, right = sum-1;
42 quicksort(array, left, right);
43
44 printf("\n");
45
46 printf("\aThe sorted numbers are listed below: \n");
47
48 for(int i = 0;i<sum;i++)
49 printf("%d ", array[i]);
50 printf("\n");
51 }
52
53
54 return 0;
55 }
以上便是关于这四种排序算法的介绍。