基础练习 数列排序

来源:互联网 发布:家庭装修设计软件 编辑:程序博客网 时间:2024/06/05 04:11

问题描述
  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
输入格式
  第一行为一个整数n。
  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
  输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9

内部排序,题目简单,而我又不擅长讲解基础知识,只能将代码附上,并对其中多处做了注释。这里采用了几种我所熟悉的排序方法,希望能对初学者有所帮助。

冒泡排序

#include<stdio.h>void  bubble_sort(int* list, int n){    //list:所传数组;n:数组长度    int i, j, temp, flag;    //flag:保存所需排序的最后位置,避免重复遍历已经排列好的元素    for(i = n - 1; i > 0;){        flag = 0;//        for(j = 0; j < i; j++){            if(list[j] > list[j + 1]){                flag = j;                temp = list[j];                list[j] = list[j + 1];                list[j + 1] = temp;            }        }        i =flag;//flag之后的元素均已排序完毕,无需再次遍历    }}int main(){    int n, i;    scanf("%d", &n);    int list[n];    for(i = 0; i < n; i++) scanf("%d", &list[i]);    bubble_sort(list, n);    for(i = 0; i < n; i++) printf("%d ", list[i]);    printf("\n");    return 0;}

插入排序

这里采用直接插入排序

#include<stdio.h>void insert_sort(int* list, int n){    int i, j, temp;    for(i = 1; i < n; i++){        for(j = i - 1; j >= 0 && list[j] > list [i]; j--, i--){            temp = list[j];            list[j] = list[i];            list[i] = temp;        }    }}int main(){    int n, i;    scanf("%d", &n);    int list[n];    for(i = 0; i < n; i++) scanf("%d", &list[i]);    insert_sort(list, n);    for(i = 0; i < n; i++) printf("%d ", list[i]);    printf("\n");    return 0;}

快速排序

#include<stdio.h>void quick_sort(int* list, int left, int right){    //左边界和右边界指向同一元素,循环结束     if(left >= right) return;    //将第一个元素设置为基准元素     int target = list[left];    int i = left, j = right;    while(i != j){        //从右往左找比基准元素小的元素        while(list[j] >= target && i < j) j--;        //从左往右找比基准元素大的元素        while(list[i] <= target && i < j) i++;        //找到之后两个元素交换位置        if(i < j){            int temp = list[i];            list[i] = list[j];            list[j] = temp;        }     }    list[left] = list[i];    list[i] = target;    quick_sort(list, left, i - 1);//对左边排序完成的继续排序     quick_sort(list, i + 1, right);//对右边排序完成的继续排序 }int main(){    int n, i;    scanf("%d", &n);    int list[n];    for(i = 0; i < n; i++) scanf("%d", &list[i]);    //函数中我定义的是边界,即数组下标,故第三个参数是 n - 1    //quick_sort(list, 0, n - 1);    for(i = 0; i < n; i++) printf("%d ", list[i]);    return 0;}
原创粉丝点击