问题标题: 酷町堂:求选择排序解析!!!!!!

0
0

0
已采纳
朱优扬
朱优扬
中级天翼
中级天翼

选择排序:

选择排序是一种简单直观的排序算法。
它的主要原理就是每一次从待排序的数据元素中选择最大(或最小)的元素放到待排序序列的开头,依次确定第1位,第2位,第3位,……,第n-1位元素(则最后第n位也确定了)。
最后序列中的元素就按照从大到小(或从小到大)的顺序排列好了。

选择排序代码(从小到大):

 

#include<iostream>

using namespace std;

int a[10000],n,i,j,t;

int main() {

    cin>>n;

    for(i=1;i<=n;i++)

        cin>>a[i];

    for(i=1;i<=n-1;i++) //依次确定a[1]~a[n-1]的值 {

        for(j=i+1;j<=n;j++) {

            if(a[j]<a[i]) //如果后面有元素a[j]比a[i]小 {

                t=a[i];

                a[i]=a[j]; //就把a[j]和a[i]的值交换,这样就能保证 a[i]的值是后面元素中的最小值

                a[j]=t;

            }

        }

    }

    for(i=1;i<=n;i++)

        cout<<a[i]<<" ";

    return 0;

}

交换函数:swap
格式:swap(a,b)
作用:实现两个元素变量中数字的交换
举例:int a=1;b=2;
swap(a,b);
cout<<a<<’ ‘<<b;
则最后输出的时候输出的结果是:2 1

0
汪恺恒
汪恺恒
中级启示者
中级启示者

快速排序

一、什么是快速排序

       快速排序是在冒泡排序基础上的优先排序法,几乎是目前所有排序法中速度最快的方法。在快速排序中,数据比较时从两端向中间进行,每次同时从两个子序列中进行比较定位,从而减少了比较次数和交换次数。

二、快速排序的基本思想

  1. 先从数据序列中选一个元素作为基准;
  2. 将序列中所有比该元素小的元素尽量往数组的左侧放,所
    有比该元素大或者相等的元素都尽量往数组的右侧放;
  3. 对左右两边分别用同样的方法处理直到每一一个待处理的序
    列的长度为1。

三、快速排序的过程

以一个含6个元素的数组为例,演示一遍快速排序的过程。
数组元素a[1]~a[6]分别是:9,5,6,12,3,4

a[1…6]快速排序过程

image.png
定义指针i,指向数组左端点;指针j,指向数组右端点。设置标兵为a[mid]=6

image.png
image.png
当a[i]<a[mid]时,i往后移; 当a[j]>a[mid]时, j往前移。
当i和j停下时,如果i还在j的前面,则交换a[i]和a[j],并把指针各移一格。

image.png
最后当j>i时,递归地对从1到j和从i到6两个数组分别进行快速排序。

a[1…3]快速排序过程

image.png
定义指针i,指向数组左端点;指针j,指向数组右端点。设置标兵为a[mid]=5。

image.png
当a[i]<a[mid]时,i往后移;当a[j]>a[mid]时,j往前移。
当i和j停下时,如果i还在j的前面,则交换a[i]和a[j],并把指针各移一格。

image.png
最后当j>i时,递归地对从1到j和从i到3两个数组分别进行快速排序。

a[1…2]快速排序过程

image.png
image.png

a[4…6]快速排序过程

image.png
image.png

a[4…5]快速排序过程

image.png
image.png

a[1…6]的排序结果

image.png
最后从a[1]到a[6]都完成了排序

四、快速排序的特点

       快速排序的时间复杂度为O(nlogn),要低于选择排序和冒泡排序点的时间复杂度O(n2)。是目前最快的排序方法。

       快速排序选择排序一样, 是一个不稳定的排序算法。插入排序冒泡排序稳定的排序算法。

实现核心

void qsort(int a[],int l,int r){
    int i=l,j=r,mid=a[(l+r)/2];
    while(i<=j){
        while(a[i]<mid) i++;
        while(mid<a[j]) j--;
        if(i<=j){
            swap(a[i],a[j]);
            i++;
            j--;
        }
    }
    if(l<j) qsort(a,l,j);
    if(i<r) qsort(a,i,r);
}

ps:你学递归了吗?

0
汪恺恒
汪恺恒
中级启示者
中级启示者

选排核心

 for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(a[j]<a[i]){
                swap(a[i],a[j]);
            }
        }
    }

 

我要回答