排序——选择排序、快速排序

知识点总结报告

知识点:

选择排序

(原理)基本思想:第i趟排序开始时,当前有序区和无序区分别为R[0...i-1]和R[i..n-1](0<=i<n-1),该趟排序是从当前无序区中选出关键字最小的元素R[k],将它与无序区的第一个元素R[i]交换,使R[0..i]和R[i+1..n-1]分别变为新的有序区和新的无序区。

  因为每趟排序均使有序区中增加了一个元素,且有序区中元素的关键字均不大于无序区中元素的关键字,即第i趟排序之后R[0..i]的所有关键字均小于等于R[i+1..n-1]中的所有关键字,所以进行n-1趟排序之后R[0..n-2]的所有关键字小于等于R[n-1].key,也就是说,经过n-1趟排序之后整个表R[0..n-1]递增有序。

简单选择排序算法

void SelectSort(RecType R[ ],int n)

{  int i,j,k;

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

  {  k=i;

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

      if(R[j].key<R[k].key)

        k=j;

    if(k!=j)

      swap(R[i],R[k]);

  }

}

快速排序

(原理)快速排序是由冒泡排序改进而得的,它的基本思想是在待排序的n个元素中任取一个元素(通常取第一个元素)作为基准,把该元素放在适当位置后,数据序列被此元素划分为两部分。所有关键字比该元素关键字小的元素放置在前一部分,所有比它大的元素放置在后一部分,并把该元素排在这两部分的中间(称为该元素归位),这个过程称为一趟快速排序,及即一趟划分。

  之后对产生的两个部分分别重复上述过程,直至每部分内只有一个元素或空为止。简而言之,每趟使表的第一个元素放入适当位置,将表一分为二,对子表按递归方式继续这种划分,直至划分的子表的长度为1或0。

  一趟快速排序的划分过程partition(R,s,t)是采用从两头向中间扫描的办法,同时交换与基准元素逆序的元素。具体方法是设两个指示器i和j,它们的初值分别为指向无序区中的第一个和最后一个元素。假设无序区中元素为R[s],R[S+1],...R[t],则i的初值为s,j的初值为t,首先将R[s]移至变量tmp中作为基准,令j自位置t起向前扫描直至R[j].key<tmp.key时将R[i]移至

位置i,然后让i向后扫描直至R[i].key>tmp.key时将R[i]移至位置j,依次重复直至i=j,此时所有R[k](k=s,s+1...,i-1)的关键字都小于tmp.key,而所有R[k](k=i+1,i+2,...,t)的关键字必大于tmp.key,此时再将tmp中的元素移至位置i,它将无序区中的元素分割成R[s..i-1]和R[i+1..t],以便分别进行排序。

快速排序算法

int partition(RecType R[ ],int s,int t)      //一趟划分

{  int i=s,j=t;

  RecTyoe tmp=R[i];          //以R[i]为基准

  while(i<j)              //从两端交替向中间扫描,直至i=j为止

  {  while(j>i&&R[j].key>=tmp.key)

      j--;            //从右向左扫描,找一个小于tmp.key的R[j]

    R[i]=R[j];            //找到这样的R[j],放入R[i]处

    while(i<j&&R[i].key<=tmp.key)

      i++;            //从左向右扫描,找一个大于tmp.key的R[i]

    R[j]=R[i];            ////找到这样的R[i],放入R[j]处

   }

   R[i]=tmp;

   return i;

}

void QuickSort(RecType R[ ],int s, int t)      //对R[s..t]的元素进行快速排序

{  int i;

  if(s<t)                   //区间内至少存在两个元素的情况

  {  i=partition(R,s,t);

    QuickSort(R,s,i-1);            //对左区间递归排序

    QuickSort(R,i+1,t);            //对右区间递归排序

  }

}

原文地址:https://www.cnblogs.com/li1997/p/8358905.html

时间: 2024-07-31 17:51:51

排序——选择排序、快速排序的相关文章

算法大神之路----排序(选择排序法)

选择排序法,顾名思义,就是把特定的数据选择出来进行排序. 选择排序法有两种方式 在所有的数据中,当由大到小排序,那么就将最大值放到第一个位置 如果由小到大排序,那么就将最小值放到第一个位置 以由小到大排序举例,当排序时候,扫描整个数据,拿第一个依次与其他做比较,如果其他数据比第一个大,或者相等,那么就不交换,如果其他数据比第一个数小,那么就交换二者的位置,扫描结束后,则从第二个数开始,依次扫描. 方法分析 无论是最坏还是最好情况,甚至是平均情况下,都需要对全部数据进行扫描,找到最大或最小值,因此

01. Java的经典排序--选择排序--冒泡排序--折半查找(二分查找)

Java的经典排序--选择排序--冒泡排序--折半查找 选择排序 选择排序 3 2 1 5 8 0 1 3 2 5 8 1 1 2 3 5 8 2 1 2 3 5 8 3 1 2 3 5 8 public static void main(String[] args) { int[] arr={3,2,1,5,8}; selectSort(arr); for(int i = 0 ; i < arr.length ; i ++){ System.out.println(arr[i]) ; } }

内部排序-&gt;选择排序-&gt;堆排序

文字描述 堆排序中,待排序数据同样可以用完全二叉树表示, 完全二叉树的所有非终端结点的值均不大于(或小于)其左.右孩子结点的值.由此,若序列{k1, k2, -, kn}是堆,则堆顶元素(或完全二叉树的根)必为序列中n个元素的最小值(或最大值). 若在输出堆顶的最小值之后,使得剩余n-1个元素的序列重又建成一个堆,则得到n个元素中的次小值.如此反复执行,便能得到一个有序序列,这个过程称之为堆排序. 由此,实现堆排序需要解决两个问题:(1)如何由一个无序序列建成一个堆?(2)如何在输出堆顶元素之后

排序--选择排序

//选择排序void Select_Sort(int *a,int n){ int i,j,k,temp; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) { if(a[k]>a[j]) k=j; } temp=a[i]; a[i]=a[k]; a[k]=temp; }}

数据结构排序-选择排序

选择排序中的两个经典算法:简单选择排序,堆排序. 简单选排:通过n-1次数据元素的比较,从n-i+1个记录中选择最小的数据,并与第i个数据进行交换,它的时间复杂度是O(n^2). 堆排序:利用堆的特征进行排序,复杂度为O(n*logn). 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int n; 5 6 /* 7 * 选择排序 8 */ 9 void SelectSort(int *array) 10 { 11 int i, j,

排序—选择排序

选择排序 排序要求:把长度为n的数组a按照从小到大的顺序进行排序. 冒泡排序思路:给定一个长度为n的数组a,循环n-1次,每次循环找出a[i]到a[n]中最小数的数,然后把该数和a[i]交换位置. 如何找出最小的数?:循环数组,逐个判断大小,把较小的数的脚标取出来,此次循环结束之后把脚标位置的数和a[i]进行交换. 排序示例: 原数组: 2.0.3.6.8.4.9.5.1.7.第1次循环排序结果: 0.2.3.6.8.4.9.5.1.7.第2次循环排序结果: 0.1.3.6.8.4.9.5.2.

iOS疯狂详解之排序(选择排序/插入排序)

选择排序 1.先求最小值 2.找到位置 3.把位置的数放到有序区 4.重复 for (int j = 0; j < count - 1; j++) { int minIndex = j;// 最小值的角标 for (int i = minIndex + 1; i < count; i++) { if (array[minIndex] > array[i]) { minIndex = i; } } if (minIndex != j) { // 优化 无序区的头 不是第一个 // 最小值

数据结构——排序——选择排序算法

选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 选择排序的主要优点与数据移动有关.如果某个元素位于正确的最终位置上,则它不会被移动.选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换.在所有的完全依靠交换去移动元素的排序方

排序——选择排序

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数其中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比較为止. 程序流程: 第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换: 第二趟,从第二个记录開始的n-1 个记录中再选出关键码最小的记录与第二个记录交换: 以此类推..... 第i 趟,则从第i 个记录開始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,直到整个序列按关