zoukankan      html  css  js  c++  java
  • 用C实现插入排序和快速排序

    • 插入排序

    插入这词太具有欺骗性,并不是说在已经生成的数组中又插进来一个什么新的数,而是从数组元素中选出一个“标杆”元素(按索引遍历),让这个元素和之前的元素进行比较,直到找出一个元素大于这个“标杆”元素进行交换。

    这样一来,我们大概可以构建出两层循环-----

    1. 外循环负责遍历数组,每次选出新的标杆元素,
    2. 内层while循环,不断在标杆所在的索引位置之前搜寻,找出大于“标杆”的元素,完成和标杆的位置交换,
    3. 如果找不到,那么标杆元素就“名正言顺的呆在”当前的索引上。
    void insertone(int a[])
    {
        int temp,i,j;
        //事先我定义的就是10个元素的数组
        for (int i = 1; i < 10; i++)
        {
            temp = a[i];//----1
            j = i - 1;//-----2
            while (j>-1 && temp<a[j])
            {
                a[j + 1] = a[j];
                j--;
            }
            a[j + 1] = temp;//----3
        }
    }
    •  快速排序

     思想大致如下:

    选取一个元素作为比较对象----就称之为前哨吧,就拿24来说

    1. 从后向前遍历,比他小的,扔到他左边
    2. 从前向后遍历,比他大的,扔到他右边
    3. 由于表示索引的i和j的值,j不断减少(后退)i不断增加(推进),上述两个条件成立的前提是i<j
    4. 理想状态下,步骤1,2,穷竭遍历也找不到比前哨大,或者小的了,那么前哨就安稳的呆在当前索引上了
    void quicksort(int a[],int start,int end)
    {
        int i = start;
        int j = end;
        int temp = a[i];
        while (i < j)//-----3
        {
            while (i<j && temp<=a[j])//-----1
            {
                j--;
            }
            if (i<j)//-----3
            {
                a[i] = a[j];
            }
            while (i<j && temp>=a[i])//-----2
            {
                i++;
            }
            if (i<j)//-----3
            {
                a[j] = a[i];
            }
        }
        a[i] = temp;//-------4
        if (start < i)
        {
            quicksort(a, start, i - 1);
        }
        if (i<end)
        {
            quicksort(a, j + 1, end);
        }
    }

    输出结果:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    void genarray(int a[],int *b)
    {
        time_t t;
        int mynum;
        FILE *fp = fopen("E:\myarray.txt", "w");
        srand((unsigned)time(&t));
        for (int i=0;i<10;i++)
        {
            *b = rand() % 100;
            fwrite(b,sizeof(int),1,fp);
        }
        fclose(fp);
    }
    void readarray(int a[],int *b)
    {
        FILE *fp = fopen("E:\myarray.txt", "rb");
    
        for (int i = 0; i < 10; i++)
        {
            fread(b, sizeof(int), 1, fp);
            //printf("%d	", mynum);
            a[i] = *b;
        }
        fclose(fp);
    }
    void main()
    {
        int a[10],mynum;
        genarray(a,&mynum);
        readarray(a, &mynum);
        for (int i = 0; i < 10; i++)
        {
            printf("%d	", a[i]);
        }
        printf("
    ");
        //insertone(a, 27);
    quicksort(a,0,9);
    for (int i=0;i<10;i++) { printf("%d ",a[i]); } system("pause"); }
  • 相关阅读:
    C# List<T>中Select List Distinct()去重复
    Spring.Net 简单入门学习
    [ASP.NET MVC]:
    打车题
    Vue------发布订阅模式实现
    Vue----数据响应原理
    小程序自定义导航栏_navigationStyle
    CleanWebpackPlugin最新版本使用问题
    js-事件函数调用简化
    用XHR简单封装一个axios
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/12230610.html
Copyright © 2011-2022 走看看