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

一、简单选择排序

对于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 = a[i];
			   a[i] = a[j];
			   a[j] = temp;
			}

		}

}

void  main()
{
	int i;
	int a[] = {4,2,6,7,44,32,35,23};
	int n = 8;
	chosesort(a,n);
	for(i =0;i<n;i++)
	{
	  printf("%d ",a[i]);
	}

}

二、堆排序

堆是一棵完全二叉树,其每个结点值都大于等于(小于等于)自己的左右孩子。

把一个数量为n的数组,构成堆,则其根结点为最大值(最小值),然后再对剩下的n-1个数构成堆,继续取出其根结点。

要完成上述过程,需要完成两个任务:

1、将一些数字构成堆

建堆方法:对初始序列建堆的过程,就是一个反复进行筛选的过程。

1)n 个结点的完全二叉树,则最后一个结点是第n/2个结点的子树。

2)筛选从第n/2个结点为根的子树开始,该子树成为堆。

3)之后向前依次对各结点为根的子树进行筛选,使之成为堆,直到根结点。

2、把根结点取出后,重新构建堆

把最后一个和根结点交换。用建堆的方式(只需要对第一个数进行建堆排序),再对前n-1个数进行建堆。

#include <stdio.h>

/*
1、s为第s个需要调整的数,n为整个数组的长度
   主要将每个结点与孩子结点进行比较
*/
void headadjust(int a[],int s,int n)
{
	 int child,temp;

	    temp = a[s];
        child = 2*s+1;
        while(child < n)
		{
		     //首先找到孩子中,大的那个
			if((child+1)<n && a[child+1]>a[child])
			{
			    child++;
			}

			if(a[s]<a[child])
			{
			    a[s] = a[child];
                s = child;
				child = 2*s+1;
			}
			else
			{
			   break;
			}

			a[s] = temp;
		}

}

//每次建立堆,都将堆的根结点交换到最后,再用headadjust函数对第一个元素进行堆排序
void heap(int a[],int length)
{
	int i,j,temp;
    for(i=(length-1)/2;i>=0;i--)
	{
	  headadjust(a,i,length);
	}
	for(j=length-1;j>=0;j--)
	{
	   temp = a[0];
	   a[0] = a[j];
	   a[j] = temp;
	   headadjust(a,0,j);
	}

}

   void main()
   {
	   int i;
	   int a[] = {3,1,5,7,2,4,9,6,10,8};
	   int n=10;
       heap(a,n);
	   for(i = 0;i<n;i++)
	   {
	     printf("%d ",a[i]);
	   }

   }

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-07 03:36:17

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

选择排序—简单选择排序(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 (当前最小元素

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

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

八大排序算法之三选择排序—简单选择排序(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

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

排序思路:在要排序的一组数中,选出最小的一个数与第一个位置的数交换:然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环.算法实现: 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

算法之简单选择排序和堆排序

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