C 排序

问题:给定6个数,按从大到小的顺序输出

解决方法:

冒泡排序

 

 代码:

#include <stdio.h>
#include <stdlib.h>
const int n = 6;

void main()
{
    int i,temp,change,j,a[n];
    //输入
    for(i = 0;i < n;i++)
    {
        printf("请输入a[%d]:",i);
        scanf("%d",&a[i]);
    }
    //输出
    for(i = 0;i < n;i++)
    {
        printf("%d	",a[i]);
    }
    printf("
");
    //从大到小排序
    for(i = 1;i < n ;i++)
    {
        change = 0;
        for(j = 0;j < n - i;j++)   // 从前向后比较
        {
            if(a[j] < a[j + 1])
            {
                temp = a[j];
                 a[j] = a[j + 1];
                a[j + 1] = temp;
                change = 1;
            }
        }
        if(change = 0)
        {
            break;
        }
    }
    //输出
    for(i = 0;i < n;i++)
    {
        printf("%d	",a[i]);
    }
    printf("
");
}
#include <stdio.h>
#include <stdlib.h>
const int n = 6;

void main()
{
    int i,temp,change,j,a[n];
    //输入
    for(i = 0;i < n;i++)
    {
        printf("请输入a[%d]:",i);
        scanf("%d",&a[i]);
    }
    //输出
    for(i = 0;i < n;i++)
    {
        printf("%d	",a[i]);
    }
    printf("
");
    //从大到小排序
    for(i = 0;i < n - 1;i++)   // n-1趟
    {
        change = 0;
        for(j = n - 1;j > i;j--)    // 从后向前比较 n-i 次
        {
            if(a[j] > a[j - 1])
            {
                temp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = temp;
                change = 1;
            }
        }
        if(change = 0)
        {
            break;
        }
    }
    //输出
    for(i = 0;i < n;i++)
    {
        printf("%d	",a[i]);
    }
    printf("
");
}

快速排序

算法思想:基于分治法:在待排序表L[1...n]中任取一个元素pivot作为基准,通过一趟排序将待排序表化为独立的两部分L[1,,k-1]和L[k+1.....n],使得L[1...k-1]中所有的元素小于pivot,L[k+1....n]中的所有元素大于或等于pivot,则pivot放在了其最终位置L(k)上,而后分别递归得对两个子表左重复操作,直至每部分内只有一个元素或空为止,即所有元素放在了其最终位置上

代码:

#include <stdio.h>
#include <stdlib.h>
const int n = 7;

//链表划分【当前第一个元素设为pivot】
int partition(int a[],int low,int high)
{
    int pivot = a[low]; //当前第一个元素设为pivot,对表进行划分
    while(low < high)
    {
        while(low < high && a[high] >= pivot) //将比pivot小的元素移动到左侧
            high--;
        a[low] = a[high];
        while(low < high && a[low] <= pivot) //将比pivot大的元素移动到右侧
            low++;
        a[high] = a[low];
    }
    a[low] = pivot; //pivot元素存放到最终位置
    return low;  //返回存放pivot的最终位置
}
//快速排序递归式
void quicksort(int a[],int low,int high)
{
    if(low < high)
    {
        int pivotpos = partition(a,low,high);
        quicksort(a,low,pivotpos - 1);
        quicksort(a,pivotpos+1,high);
    }
}
void main()
{
    int a[] = {1,4,7,8,5,2,3};
    int low = 0, high = n - 1,i;
    quicksort(a,low,high);

    printf("排序后:
");
    for(i = 0;i < n;i++)
    {
        printf("%d	",a[i])
    }
}

 使pivot每次是随机选取

??排序

#include <stdio.h>
#include <stdlib.h>
const int n = 6;

void main()
{
    int i,temp,change,j,a[n];
    //输入
    for(i = 0;i < n;i++)
    {
        printf("请输入a[%d]:",i);
        scanf("%d",&a[i]);
    }
    //输出
    for(i = 0;i < n;i++)
    {
        printf("%d	",a[i]);
    }
    printf("
");
    //从大到小排序
    for(i = 0;i < n - 1;i++)   // n-1趟
    {
        change = 0;
        for(j = i + 1;j < n;j++)    // 从开头起 逐元素比较
        {
            if(a[i] < a[j])
            {
                temp = a[j];
                a[j] = a[i];
                a[i] = temp;
                change = 1;
            }
        }
        if(change = 0)
        {
            break;
        }
    }
    //输出
    for(i = 0;i < n;i++)
    {
        printf("%d	",a[i]);
    }
    printf("
");
}

简单选择排序

算法思想:假设排序表为L【1....n】,第 i 趟排序即从L【i....n】中选择关键字最小的元素与L(i)交换,每一趟排序可以确定一个元素的最终位置,这样经过n - 1 趟排序就可以使得整个排序表有序·

#include <stdio.h>
#include <stdlib.h>

void main()
{
    int a[7] = {1,4,7,8,5,2,3};
    // 选择排序
    int i,j,min,temp;
    for(i = 0;i < 6;i++)  //一共进行n - 1趟
    {
        min = i;  //记录最小元素位置
        for(j = i + 1;j < 7;j++) //在a【i....n - 1】中选择最小的元素
        {
            if(a[j] < a[min])
                min = j;  //更新最小元素位置
        }
        if(min != i)
        {
            //与第i个位置交换
            temp = a[i];
            a[i] = a[min];
            a[min] = temp;
        }
    }
    //排序后输出
    for(i = 0;i < 7;i++)
    {
        printf("%d	",a[i]);
    }
}
原文地址:https://www.cnblogs.com/pam-sh/p/12436706.html