选择排序--------简单选择排序

基本思想:

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

操作方法:

第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;

第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;

以此类推.....

第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与第i 个记录交换,

直到整个序列按关键码有序。

最好情况时间:O(n^2)。

最坏情况时间:O(n^2)。

void SelectSort(int a[] , int n)
{
       int temp,i,j,k;
       for(i=0;i<n-1;i++)
       {
          k=i;
          for(j=i+1;j<n;j++)
              if(a[k]>a[j])
                   k=j;                    //找出剩余数列中的最小元素
          if(k!=i)
          {
                temp=a[k];
                a[k]=a[i];
                a[i]=temp;
          }

      }

}

简单选择排序的改进——二元选择排序

简单选择排序,每趟循环只能确定一个元素排序后的定位。我们可以考虑改进为每趟循环确定两个元素(当前趟最大和最小记录)的位置,从而减少排序所需的循环次数。改进后对n个数据进行排序,最多只需进行[n/2]趟循环即可。具体实现如下:

void SelectSort(int r[],int n) {
    int i ,j , min ,max, tmp;
    for (i=0 ;i <= n/2;i++)
    {               // 做不超过n/2趟选择排序
        min = i; max = i ;                     //分别记录最大和最小关键字记录位置
        for (j= i+1; j< n-i; j++)
        {
            if (r[j] > r[max])
            {
                max = j ;
                continue ;
            }
            if (r[j]< r[min])
                min = j ;
        }
      //该交换操作还可分情况讨论以提高效率
      tmp = r[i-1]; r[i-1] = r[min]; r[min] = tmp;
      tmp = r[n-i]; r[n-i] = r[max]; r[max] = tmp;   

    }
}  
时间: 2024-10-22 04:18:16

选择排序--------简单选择排序的相关文章

选择排序—简单选择排序(Simple Selection Sort)

基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止. 简单选择排序的示例: 操作方法: 第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换: 第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换: 以此类推..... 第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与

选择排序—简单选择排序(Simple Selection Sort)原理以及Java实现

基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止. 简单选择排序的示例: 操作方法: 第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换: 第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换: 以此类推..... 第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与

排序算法6--选择排序--简单选择排序

简单选择排序 简单选择排序属于选择排序, 选择排序的思想是:每一趟从待排序的记录中选出关键字最小的记录,按顺序放在以排序的记录序列的后面,知道全部排完为止. 1.简单选择排序法是每次循环找出最值,循环结束后将最值调整到合适位置,交换的次数少. 每次找出当前无序队列中的最小的元素与第一个交换位置,再选择第二小的与第二个交换位置 原始队列:   3 5 6 2 4 1(最小元素1与3交换) 第一步: 1 5 6 2 4 3 (当前最小元素2与5交换) 第二步: 1 2 6 5 4 3 (当前最小元素

八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)

基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止. 简单选择排序的示例: 操作方法: 第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换: 第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换: 以此类推..... 第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与

汇编实现排序——简单选择排序

上阵子重温数据结构,差不多更新到排序.这学期学了汇编语言,其中有几个实验便是实现内部排序算法.以下是实现简单选择排序的程序设计: S0 SEGMENT STACK DW 20 DUP(?) TOP LABEL WORD S0 ENDS S1 SEGMENT TIP DB "Input ten number and separate the numbers with space:", 0DH, 0AH, 24H ARY DW 20 DUP(0) CRLF DB 0DH, 0AH, 24H

选择排序---简单选择排序 堆排序

一.简单选择排序 对于n个数要进行n次排序,第一次,将最小的数放在第一个.第二次,将第二小的树,放在第二个.... 每次都和后面的数做比较,如果是从小到大的排序,当当前的数字比后面的大时,要进行交换. #include <stdio.h> void chosesort(int a[],int length) { int i,j,temp; for(i=0;i<length;i++) for(j=i+1;j<length;j++) { if(a[i]>a[j]) { temp

数据结构之选择排序--简单选择排序

排序思路:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环.算法实现: public static void selectSort(int arr[]){ int temp; for(int i = 0;i < arr.length-1; i ++){//有N个元素只需比较N-1次 int min = i;//记住初始位置 for(int j = i+1; j < arr.length; j ++){//在 [i+1,arr.

排序 - 简单选择排序

#include<cstdio> #include<cstdlib> #include<cstring> #define MAXSIZE 10 typedef struct{ int r[MAXSIZE+1]; int length; }SqList; void Swap(SqList *L,int i,int j){ int temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp; } void Se

简单的选择排序(内部排序)

1 /** 2 * 3 */ 4 package com.trfizeng.selectionsort; 5 6 /** 7 * @author trfizeng 内部排序 选择排序—简单选择排序(Simple Selection Sort) 8 */ 9 public class SimpleSelectionSort { 10 11 /** 12 * 每次选择一个最小记录放在前面去 13 */ 14 public static int[] simpleSelectionSort(int[]