【数据结构之八大内排序】选择排序(简单选择,堆排序)

简单选择

不稳定

最差时间:O(n)

平均时间:O(n)

最好时间:O(n)

空间:O(1)

#include <stdio.h>
#define Swap(x,y,t) ((t)=(x),(x)=(y),(y)=(t))
#define MaxSize 100
typedef struct list {
	int Size,MaxList;
	int Elements[MaxSize];
}List;
List CreateList(int n,int max) {
	List ls ;
	int i ;
	ls.Size=n;
	ls.MaxList=max;
	for(i=0;i<n;i++) {
		scanf("%d",&ls.Elements[i]);
	}

	return ls;
}

void SelectSort(List *list) {
	int small,i,j,temp;
	for(i=0;i<list->Size-1;i++) {
		small=i;
		for(j=i+1;j<list->Size;j++) {
			if(list->Elements[j]<list->Elements[small])small=j;
		}
		if(small!=i)Swap(list->Elements[i],list->Elements[small],temp);
	}
}

void PrintList(List list) {
	int i ;
	for(i=0;i<list.Size;i++) {
		printf("%d ",list.Elements[i]);
	}
}
void main() {
	int n ,maxList;
	List list;
	while(scanf("%d%d",&n,&maxList)!=EOF) {
		list=CreateList(n,maxList);
		SelectSort(&list);
		PrintList(list);
	}
}

堆排序

不稳定

最差时间:O(nlogn)[堆是完全二叉树,向下调整函数AdjustDown的执行时间不超过O(logn),因此建堆最坏时间是O(logn), 运算的最坏时间为                                              O(n),每输出一个记录都调用一次AjustDown,所以执行时间O(nlogn).]

平均时间:O(nlogn)

最好时间:O(nlogn)

空间:O(1)[只需要一个用于交换两个记录时使用的记录变量temp,而不再需要其他额外的记录空间]

#include <stdio.h>
#define MaxSize 100
#define Swap(x,y,t) ((t)=(x),(x)=(y),(y)=(t))
typedef int T;

typedef struct minheap {
	int Size,MaxHeap;
	T Elements[MaxSize];
}MinHeap;

void AdjustDown(T heap[],int r,int n ) {
	int child=2*r;
	T temp=heap[r];
	while(child<=n) {
		if(child<n && heap[child]>heap[child+1])child++;
		if(temp <= heap[child])break;
		heap[child/2] = heap[child];
		child*=2;
	}
	heap[child/2]=temp;
}

void HeapSort(MinHeap *hp) {
	int i ;
	int temp;
	for(i=hp->Size/2;i>0;i--) {		//建堆
		AdjustDown(hp->Elements,i,hp->Size);
	}
	for(i=hp->Size;i>1;i--) {//选择排序
		printf("%d ",hp->Elements[1]);
		Swap(hp->Elements[1],hp->Elements[i],temp);
		AdjustDown(hp->Elements,1,i-1);
	}
	printf("%d\n",hp->Elements[1]);
}

//2th Method
/*
void reaheap(T *heap,int n) {
	int parent = 0 , end = n , child = 1,right,temp;
	while(child<end) {
		right = child +1;
		if((right<end)&&(heap[right]<heap[child])) {
			child = right;
		}
 		if(heap[parent]<heap[child]) break; 

 		temp = heap[child];
 		heap[child]=heap[parent];
 		heap[parent]=temp;

 		parent = child;
 		child = 2*parent+1;
	}
}*/

MinHeap CreateInitHeap(int n , int max){
	int i;
	MinHeap hp ;
	hp.Size=n ; //下标从1开始
	hp.MaxHeap=max;
	for (i=1;i<=n;i++ ) {
		scanf("%d",&hp.Elements[i]);
	}
	return hp;
}

void PrintHeap(MinHeap hp) {
	int i;
	for(i=1;i<=hp.Size;i++) {
		printf("%d ",hp.Elements[i]);
	}
}
void main() {
	int n ,maxHeap;
	MinHeap hp;
	while(scanf("%d %d",&n,&maxHeap)) {
		hp=CreateInitHeap(n,maxHeap);
		HeapSort(&hp);
	//	PrintHeap(hp);

	}
}
时间: 2024-10-20 20:11:37

【数据结构之八大内排序】选择排序(简单选择,堆排序)的相关文章

14. 蛤蟆的数据结构进阶十四排序实现之简单选择排序

14. 蛤蟆的数据结构进阶十四排序实现之简单选择排序 本篇名言:"即是我们是一支蜡烛也应该 " 蜡烛成灰泪始干 " 即使我们只是一根火柴也要在关键时刻有一次闪耀即使我们死后尸骨都腐烂了解也要变成磷火在荒野中燃烧. -- 艾青" 继续来看什么是简单选择排序. 欢迎转载,转载请标明出处: 1.  简单选择排序 设所排序序列的记录个数为n.i取1,2,-,n-1,从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出排序码最小的记录,与第i个记录交换.执行n-1趟后就完

排序算法之简单选择排序

基本思想 在一组元素中选择具有最小排序码的元素,若它不是这组元素中的第一个元素,则将它与这组元素中的第一个元素对调:在未排序的剩下的元素中反复运行以上步骤,直到剩余元素仅仅有一个为止. 代码 private void selectSort(int[] a, int left, int right) { for (int i = left; i < right; i++) { int k = i; int temp; for (int j = i + 1; j <= right; j++) {

排序系列 之 简单选择排序及其改进算法 —— Java实现

简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 3,1,5,7,2,4,9,6(共8个数) 1.n=8 个数中,最小数值为1,与第一个数交换:1,3,5,7,2,4,9,6 2.剩下 n-1=7 个数中,最小数值为2,与第二个数交换:1,2,5,7,3,4,9,6 3.剩下 n-2=6 个数中,最小数值为3,与第三个数交换:1,2,3,7,5,4

选择排序=》(简单选择排序)

/** * 选择排序(简单选择排序) * @author Cinn * */public class selectSort { /**     * @param args     */    public static void main(String[] args) {        // TODO Auto-generated method stub        int[] array= {48,58,50,98,69,51,27,99,100};        selectsort(ar

排序 之 冒泡排序 简单选择排序 直接插入排序 希尔排序

排序的基本概念 假设含有n个记录的序列为{r1,r2,--,rn},其相应的关键字分别为{k1,k2,--,kn},需确定1,2,--,n的一种排序p1,p2,--,pn,使其相应的关键字满足kp1≤kp2≤--≤kpn非递减(或非递增)关系,即使得序列称为一个按关键字有序的序列{rp1,rp2,--,rpn},这样的操作就称为排序. 排序的稳定性 假设ki=kj(1≤i≤n,1≤j≤n,i≠j),且在排序前的序列中ri领先于rj(即i<j).如果排序后ri仍领先于rj,则称所用的排序方法是稳定

《大话数据结构》读书笔记——9.4简单选择排序

//c 实现 1 #include "stdafx.h" 2 #include "stdlib.h" 3 4 void swap(int& a,int& b) 5 { 6 int t =a; 7 a = b; 8 b = t; 9 } 10 int _tmain(int argc, _TCHAR* argv[]) 11 { 12 int arr[6] ={0,5,3,4,6,2}; 13 int i,j; 14 for(i=0;i<6;i++)

大话数据结构——简单选择排序

在学了冒泡排序后,会发觉这种算法就是不断比较交换.虽简单直接,显然给人一种繁琐的感觉.那有没有更好一点的算法呢?这当然有啦,没有就糟糕透了 :-P 这篇文章介绍一种较冒泡要好的排序算法:简单选择排序 看到“选择”这两字估计也猜到一二了.没错,这种算法的思想就是:待找到了最适合的那位数的位置我才选择与它进行交换 这样做,我们大大省下了很多不必要的交换.因为在代码编写中,交换函数是经常使用,所以一般将其封装成一个函数进行调用.如果存在非常多不必要的交换操作,这就产生了非常多不必要的函数调用.要知道,

排序之简单选择排序

前言 本篇博客是在伍迷兄的博客基础上进行的,其博客地址点击就可以进去,里面好博客很多,我的排序算法都来自于此:一些数据结构方面的概念我就不多阐述了,伍迷兄的博客中都有详细讲解,而我写这些博客只是记录自己学习过程,加入了一些自己的理解,同时也希望给别人提供帮助. 基本思想 选择排序的基本思想是每一趟在n-i+1(i=1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列的第i个记录.我们这里先介绍的是简单选择排序法.简单选择排序法(Simple Selection Sort)就是通过n-i次

排序——直接选择排序(简单选择排序)

直接选择排序也称简单选择排序,是一种相对简单的排序算法,它的基本思想是:从一列数中找出最小的,和第一个交换:剩下的重新找出最小的,和这列数的第二个交换,......一直进行n-1次比较之后,该数列已经为有序数列了. 例如:已知一组无序数列:6 3 5 1 4 2 9 第一次:[6 3 5 1 4 2 9] 最小数为:1 第二次:1 [3 5 6 4 2 9] 最小数为:2 第三次:1 2 [5 6 4 3 9] 最小数为:3 第四次:1 2 3 [6 4 5 9] 最小数为:4 第五次:1 2