本文内容包括:选择法排序,交换法排序,冒泡法排序,插入法排序四种最基础的排序方法。
选择法排
基本的排序过程如下:
j = 1 | ||||||
第1遍 | i = 0 | 84 | 83 | 88 | 87 | 61 |
j = 2 | ||||||
第2遍 | i = 1 | 88 | 83 | 84 | 87 | 61 |
j = 3 | ||||||
第3遍 | i = 2 | 88 | 87 | 84 | 83 | 61 |
j = 4 | ||||||
第4遍 | i = 3 | 88 | 87 | 84 | 83 | 61 |
排序结果 | 88 | 87 | 84 | 83 | 61 |
代码如下:
#include #include //选择法排序int main(){int arr[5] = {84, 83, 88, 87, 61};int i, j,k,temp = 0;for(i = 0; i < 4; i++)//n个数,最多比较n-1次{k = i;for(j = i+1; j < 5; j++){if(arr[k] < arr[j])//按数组arr的元素从高到低排序{k = j; //记录下最大数的下标位置}}if(k != i)//若最大数所在的下标位置不在下标位置i{temp = arr[k];arr[k] = arr[i];arr[i] = temp;}}for(i = 0; i < 5; i++){printf("%d ", arr[i]);}return 0;}
交换法排序
具体代码如下:
#include #include //交换法排序int main(){int arr[5] = {84, 83, 88, 87, 61};int i, j;for(i = 0; i < 4; i++)//4 = n - 1,n:数组元素的个数{for(j = i+1; j < 5; j++)//5 = n{if(arr[i] < arr[j]){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}for(i = 0; i < 5; i++){printf("%d ", arr[i]);}return 0;}
就个人而言,我更喜欢使用交换法排序,因为我感觉代码量少。
冒泡法排序
冒泡排序:(1)从当前元素算起,向后依次比较每一对相邻的元素,若逆序,则交换;
(2)对所有元素均进行以上步骤,直到最后一个元素
#include #include //冒泡法排序int main(){int arr[5] = {84, 83, 88, 87, 61};int i, j;for(i = 0; i < 4; i++)//n-1 = 4,指共进行几趟冒泡排序{for(j = 0; j < 4-i; j++)//4-i = n - 1-i{if(arr[j] < arr[j+1]){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}for(i = 0; i < 5; i++){printf("%d ", arr[i]);}return 0;}
4-i 的解释:4-i = n-1-i,以i = 0 (第一趟冒泡排序为例),(j = 0;j < 4; j++),则 arr[0]与arr[1], arr[1]与arr[2], arr[2]与arr[3], arr[3]与arr[4], 进行交换,接下来均以此为例进行第二趟,第三趟…的冒泡。
插入法排序(二分法)
中文名 插入排序
外文名 Insertion sort
别名 直接插入排序
分类 排序方法
时间复杂度 O(N^(1-2))
插入排序是一种最简单的排序方法,它的基本思路是将一个记录插入到已经排好序的的有序表中,从而一个新的,记录数增一的有序表中。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。
#include #include //插入法排序int main(){int arr[5] = {84, 83, 88, 87, 61};int flag = 0, i, j;for(i = 1; i = 0 && arr[j] < flag; j--){arr[j+1] = arr[j];}arr[j+1] = flag;}for(i = 0; i < 5; i++){printf("%d ", arr[i]);}return 0;}
以上内容就是几种简单排序的基本归纳,欢迎大家指正。