排序(选择排序)

选择排序是每次从序列中挑出一个最小的数字放在开始位置,依次往后即可,如何找到最小的元素可以有两种方法。

1、简单选择排序,就是直接找了,每次找到最小那个放在起始位置。

2、堆排序,在二叉树中执行,要求每个节点都比左右节点大,整个树的根节点就是最大的,然后将根节点与最后一个节点调换位置,并重新排列,这样最大值依次往后放置。

给代码。

#coding:utf-8

import random

def simpleChooseSort(numList):    lengthen = len(numList)#记录数组大小    i = 0    index = 0 #记录查询过程中的当前最大值索引    while i < lengthen - 1:        index = i        j = i + 1        while j < lengthen:            if numList[j] < numList[index]:                index = j            j += 1        if index != i:            numList[i],numList[index] = numList[index],numList[i]        i += 1

#堆排序def heapSort(numList):    lengthen = len(numList)    start = lengthen / 2    while start >= 0:        maxHeap(numList,start,lengthen)        start -= 1    start = lengthen - 1    while start >= 2:        numList[0],numList[start] = numList[start],numList[0]        maxHeap(numList,0,start - 1)        start -= 1    if numList[0] > numList[1]: #这里比较奇怪,不知道为什么如果去掉这几句,每次排序下来总是发现根节点处发生问题。        numList[0],numList[1] = numList[1],numList[0]    if numList[0] > numList[2]:        numList[0],numList[2] = numList[2],numList[0]    if numList[1] > numList[2]:        numList[1],numList[2] = numList[2],numList[1]

#整理数组得到二叉堆def maxHeap(numList,startIndex,lengthen):    l = 2 * startIndex + 1    r = 2 * startIndex + 2    if l < lengthen and numList[startIndex] < numList[l]:        minIndex = l    else:        minIndex = startIndex    if r < lengthen and numList[minIndex] < numList[r]:        minIndex = r    if minIndex != startIndex:        numList[startIndex],numList[minIndex] = numList[minIndex],numList[startIndex]        maxHeap(numList,minIndex,lengthen)

#测试简单选择排序def test1():    import random    a = []    for i in range(100):        temp = random.randint(0, 100)        while True:            for x in range(len(a)):                if a[x] == temp:                    temp = random.randint(0, 100)                    break            else:                a.append(temp)                break    # print ‘\n‘,len(a),‘\n‘    for x in a:        print x,    simpleChooseSort(a)    print ‘\n‘    for x in a:        print x,

#测试堆排序def test2():    import random    a = []    for i in range(100):        temp = random.randint(0, 100)        while True:            for x in range(len(a)):                if a[x] == temp:                    temp = random.randint(0, 100)                    break            else:                a.append(temp)                break    # print ‘\n‘,len(a), ‘\n‘    print ‘\n‘    for x in a:        print x,    heapSort(a)    print ‘\n‘    for x in a:        print x,

if __name__ == ‘__main__‘:   test1()   test2()
时间: 2024-09-29 07:10:13

排序(选择排序)的相关文章

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

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

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]) ; } }

排序--选择排序

//选择排序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 个记录交换,直到整个序列按关

排序 选择排序&amp;&amp;堆排序

选择排序&&堆排序 1.选择排序: 介绍:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾.以此类推,直到所有元素均排序完毕. 步骤:假设数组array长度为N即有数组内有N个数据未排序数据 1.第一趟遍历将这N个数据中最小的数据和array[0]交换. 2.第二趟则遍历N-1个数据,将这N-1个数据中最小的和arra

C-冒泡排序,选择排序,数组

——构造类型 ->数组 ->一维数组 ->相同类型的一组数据 ->类型修饰符--数组名—[数组的元素个数(必须是整型表达式或者是整型常量,不能是变量)] {初始化} int arr[3] = {1,2,3}; arr[1] = 5; printf("%d",arr[1]); ->数组内存的值为变量 ->使用数组的时候中括号内可以是变量 ->sizeof()是一个运算符,不是一个函数,可以计算变量或者变量修饰符占了多少个字节,也可以对数组进行计算