C 语言教程 在线

1795c-exercise-example37

参考实例:

#include <stdio.h>

typedef void (*p_func)(int *, int);

void select_sort(int  *arr, int size)   //选择排序
{
    int i = 0, j = 0;
    for(i = 0; i < size; i++)
    {
        for(j = i; j < size; j++)
        {
            if(arr[i] > arr[j] )
            {
                arr[i] ^= arr[j];
                arr[j] ^= arr[i];
                arr[i] ^= arr[j];
            }
        }
    }
}

void bubble_sort(int *arr, int size)    //冒泡排序
{
    int i = 0, j = 0;
    for(i = 1; i < size; i++)
    {
        for(j = 0; j < size - i; j++)
        {
            if(arr[j] > arr[j+1])
            {
                arr[j] ^= arr[j+1];
                arr[j+1] ^= arr[j];
                arr[j] ^= arr[j+1];
            }   
        }   
    } 
}
void quick_sort(int *arr, int size)     //快速排序
{
    if(size <= 1)
        return;
    int base = *arr;
    int head = 0, tail = size - 1;
    while(head < tail)
    {
        if(arr[head] > arr[tail])
        {
            arr[head] ^= arr[tail];
            arr[tail] ^= arr[head];
            arr[head] ^= arr[tail];
        }
        if(arr[head] == base)
            tail--;
        else head++;
    }
    quick_sort(arr, head - 1);
    quick_sort(&arr[head + 1], size - head - 1);
}
int main()
{
    int arr[] = {0, 4, 2, 8, 6, 1, 5, 9, 3, 7};
    int i = 0, j = 0;
    p_func p_sort[] = {select_sort, bubble_sort, quick_sort};
    for(i = 0; i <= 2; i++)
    {
        p_sort[i](arr, sizeof(arr)/sizeof(int));
        i == 0 ? printf("select : ") : i == 1 ? printf("bubble : ") : printf("quick  : ");
        for(j = 0; j < sizeof(arr)/sizeof(int); j++)
            printf("%d  ", arr[j]);
        printf("\n");
    }

    return 0;
}

1794c-exercise-example37

参考方法:

#include<stdio.h>
#include<stdlib.h>
void bubblesort(int a[],int n)
{
    int i, j;
    int flag ;
    for(i = 0; i < n - 1; i++)
    {
        flag = 0;
        for(j = 0; j < n - 1; j++)
        {
            int temp;
            if(a[j] > a[j + 1])
            {
                temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
                flag = 1;
            }
        }
        if(flag == 0)
            break;
    }
}

int mycmp(const void *a,const void *b)
{
    if((const int *)a - (const int *)b == 0)
        return 0;
    else if((const int *)a - (const int *)b > 0)
        return 1;
    else
        return -1;
}

int main(void)
{
    int a[10];
    printf("请输入 10 个数字:\n");
    for(int i = 0; i < 10; i++)
        scanf("%d",&a[i]);

    qsort(a,10,sizeof(int),mycmp); //快速排序

    bubblesort(a,10);//冒泡排序
    
    printf("排序结果是:\n");
    for(int i = 0; i < 10; i++)
        printf("%d ",a[i]);

    return 0;
}

1793c-exercise-example37

基础算法之简单选择排序(selection sort)

1,名 称:简单选择排序

2,复杂度:O(n^2)

3,实现方式:C语言

4,空间复杂度:O(1)

5,稳定性:不稳定

6,算法思想:总共遍历两次,外层循环是算法总共要至执行的此数,那么为什么呢?因为该算法每一次执行外层循环会进行一次交换,默认i所在的位置是最大或者最小(要根据升序还是降序确定),然后里层循环是确定要交换的数字,请具体的思想请大家去代码中体会吧!

7,算法种类:升序(ascending order)、降序(descending order)

8,算法实现代码:

注意:以下实例在 Windows 平台编译通过, Linux 上没有 conio.h 文件,所以无法编译通过。

Linux 上可以使用 #include <curses.h> 来代替 conio.h 文件提供的功能,安装方法:

ubuntu:

sudo apt-get install libncurses5-dev libncursesw5-dev

Centos:

sudo yum install ncurses-devel ncurses
#include "stdio.h"  
#include "conio.h"   
  
void swap(int *a, int *b){  
    int temp ;  
    temp = *a;  
    *a = *b;  
    *b = temp;  
}  
//升序---简单选择排序  
SelectionSortAsc(int *a,int n){  
    int i,j,min;  
    for( i = 0;i < 10; i++){  
        min = i;  
        for(j = i+1;j < 10; j++){  
            if(a[j] < a[min]){  
                min = j;      
            }     
        }  
        if(min != i)          
        swap(&a[i],&a[min]);  
    }  
    printf("\n  ascending order:");                   
}   
//降序---简单选择排序  
SelectionSortDesc(int *a,int n){  
    int i,j,max;  
    for( i = 0;i < 10; i++){  
        max = i;  
        for(j = i+1;j < 10; j++){  
            if(a[j] > a[max]){  
                max = j;      
            }     
        }  
        if(max != i)          
        swap(&a[i],&a[max]);  
    }  
    printf("\n  descending order:");                  
}   
 main(){  
    int i;  
    int  a[20] = {10,8,6,5,3,2,9,7,4,1};  
    SelectionSortAsc(a,10);   
    for(i = 0 ; i < 10; i++)  
        printf("%d ",a[i]);  
    printf("\n");     
    SelectionSortDesc(a,10);  
    for(i = 0 ; i < 10; i++)  
        printf("%d ",a[i]);  
    getche();     
}

1792c-exercise-example36

参考方法:

#include <stdio.h>
#define N 101

int prime[N],pNum=0;
int p[N]={0};   //0表示为素数,1表示为非素数

void Find_Prime(){
    int i,j;
    for(i=2;i<N;i++){
        if(p[i]==0){
            prime[pNum++]=i;
            //埃氏筛法
            for(j=i+i;j<N;j+=i)
                p[j]=1;
        }
    }
}

int main(){
    Find_Prime();
    int i;
    for(i=0;i<pNum;i++){
        printf("%d ",prime[i]);
    }
    return 0;
}

1791c-exercise-example36

参考方法:

//使用数组存储已经获得的素数,使用该数组做为底,当取值范围较大时可有效减少运算量
#include<stdio.h> 

int main()
{
    int i,j,k=0,n;    //k为素数数组的下标
    int prime[1000];   //建立一个素数数组
    printf("请输入求素数值的范围(0-1000):\n");
    scanf("%d",&n);
    prime[0]=2;       //给第一个数组元素赋值
    for(i=2;i<=n;i++)
    {
        for(j=0;j<=k;j++)  
        {
            if(i%prime[j]==0) //求余比较只要对当前的素数数组求余即可
                break;
        }
        if(j>k)
        {
            k++;                //判断i是否为素数,如果是,将其加入数组,下标k加一
            prime[k]=i;
        }   
    } 
    for(i=0;i<=k;i++) 
        printf("%d  ",prime[i]);
}