冒泡排序,选择排序,快速排序

以前学过这三种方法,时间长不用都已经忘了,前天上算法设计课提到这三个算法,于是拿出来总结一下。


一、冒泡排序

基本原理 :相邻两个元素比较,大的一个后移。一趟可以把最大的数(或最少的数)排到最后面。然后进行第二趟比较。。一直得出结果。


比如10个数,a[10] = { 4 5 6 7 10 9 2 1 8 3 },以升序为例,4和5选比较,不交换;5和6比较,不交换;一直到10和9比较,交换一次。然后10和2比较,交换。。。一直把10交换到最后一个位置上。然后进行第二趟比较,可以把9交换到倒数第二个位置,以此类推。


代码实现:

#include<stdio.h>
void SortMaopao(int *num,int n);
int main()
{
        int a[10];
        int i;
        printf("please input 10 numbers:\n");
        for(i = 0; i < 10; i++)
        {
                scanf("%d",&a[i]);
        }
        SortMaopao(a,10);
        for(i = 0; i < 10; i++)
        {
                printf("%d ",a[i]);
        }
        printf("\n");           
        return 0;
}

void SortMaopao(int *a ,int n)
{
        int i,j,t;
        for(i = 0; i < n - 1; i++)
        {
                for(j = 0; j < n - 1 - i; j++)
                {
                        if(a[j] > a[j+1])
                        {
                                t = a[j];
                                a[j] = a[j+1];
                                a[j+1] = t;
                        }       
                }
        }
}       
二、选择排序

1.加入一个数组A = {5,3,6,2,4,7},我们对他进行排序

2.确定最小的元素放在A[0]位置,我们怎么确定呢,首先默认最小元素为5,他的索引为0,然后用它跟3比较,比他打,则认为最小元素为3,他的索引为1,然后用3跟6比,发现比他小,最小元素还是3,然后跟2比,最小元素变成了2,索引为3,然后跟4比,跟7比。当比较结束之后,最小元素也尘埃落定了。就是2,索引为3,然后我们把他放在A[0]处。为了使A[0]原有数据部丢失,我们使A[0](要放的位置) 与A[3](最小数据的位置)交换。这样就不可以了吗?


3.然后我们在来找第二小元素,放在A[1],第三小元素,放在A[2]。。当寻找完毕,我们排序也就结束了。


4.不过,在找的时候要注意其实位置,不能在找A[2]的时候,还用A[2]的数据跟已经排好的A[0],A[1]比,一定要跟还没有确定位置的元素比。还有一个技巧就是我们不能每次都存元素值和索引,我们只存索引就可以了,通过索引就能找到元素了。呵呵。


5.他和冒泡的相似和区别,冒泡和他最大的区别是他发现比他小就交换,把小的放上面,而选择是选择到最小的在直接放在确定的位置。选择也是稳定的排序。

代码实现:

#include<stdio.h>
void SelectSort(int *a,int n);

int main()
{
        int a[10];
        int i;
        printf("please input 10 numbers:\n");
        for(i = 0; i < 10; i++)
        {
                scanf("%d",&a[i]);
        }
        SelectSort(a,10);
        for(i = 0; i < 10; i++)
        {
                printf("%d ",a[i]);
        }
        printf("\n");
        return 0;
}

void SelectSort(int *a, int n)
{
        int i,minIndex,j;

        for(i = 0; i < n - 1; i++)
        {
                minIndex = i;
                for(j = i + 1; j < n ; j++)
                {
                        if(a[minIndex] >= a[j])
                        {
                                minIndex = j;
                        }

                }
                if(i != minIndex)
                {
                        int temp;
                        temp = a[i];
                        a[i] = a[minIndex];
                        a[minIndex] = temp;
                }
        }
}


三、快速排序

基本思想:取一个数为关键字key(一般取第一个数),然后把比key小的数放在key 的左边,比key 大的数放在key 的右边,可以快速分成两个子表,这叫一趟扫描。然后再用同样的方法对左子表和右子表分别进行扫描。

代码实现:

#include<stdio.h>
void QuickSort(int *a, int low, int high);
int QuickPass(int *a, int left, int right);

int main()
{
        int a[10];
        int i;
        printf("please input 10 numbers:\n");
        for(i = 0; i < 10; i++)
        {
                scanf("%d",&a[i]);
        }
        QuickSort(a,0,9);
        for(i = 0; i < 10; i++)
        {
                printf("%d ",a[i]);
        }
        printf("\n");
        return 0;
}

void QuickSort(int *a, int low, int high)
{
        int pos;
        if(low < high)
        {
                pos = QuickPass(a, low, high);
                QuickSort(a, low, pos - 1);
                QuickSort(a, pos + 1, high);
        }
}

int QuickPass(int *a, int left, int right)
{
        int x, high ,low;
        low = left;
        high = right;
        x = a[left];
        while(low < high)
        {
                while(low < high && a[high] >= x)
                        high--;
                if(low < high)
                {
                        a[low] = a[high];
                        low++;}

                while(low < high && a[low] < x)
                        low++;
                if(low < high)
                {
                        a[high] = a[low];
                        high--;
                }
        }
        a[low] = x;
        return low;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值