演算法學習之選擇排序和堆排序:

我是小白同學發表於2020-12-05

演算法學習之選擇排序和堆排序:

1.選擇排序:

(1)思想:在每一趟待排序元素中選取關鍵字最小的元素加入有序子序列中。

(2)效能分析:空間複雜度O(1) 時間複雜度O(n^2)

(3) 穩定性:不穩定 ,適用於順序表,連結串列。

(4)演算法實現:

void SelectSort(int A[],int n){
for(int i=0;i<n-1;i++){
        int min=i;
    for(int j=i+1;j<n;j++)
        if(A[j]<A[min])
            min=j;
if(min!=i)
    swap(A[i],a[min]);
}
}
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
void SelectSort(int A[],int n);
int main(){
	int A[MAX];
	int i,n;
	printf("請輸入待排數的個數:\n");
	scanf("%d",&n);
	printf("請輸入待排數:\n");
	for(i=0;i<n;i++)
	scanf("%d",&A[i]);
	SelectSort(A,n);
	printf("排序結果為: \n");
    Printfarry(A,n);
    return 0;
} 
void swap(int *a,int *b){
	int temp;
	temp=*a;
	*a=*b;
	*b=temp;

} 
void Printfarry(int A[],int n){
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d\n",A[i]);
	}
	return;
	 } 
void SelectSort(int A[],int n){
int i,j;
for( i=0;i<n-1;i++){
        int min=i;
    for(j=i+1;j<n;j++)
        if(A[j]<A[min])
            min=j;
if(min!=i)
    swap(&A[i],&A[min]);
}
}

在這裡插入圖片描述

2.堆排序:

(1)演算法思想:

建堆:編號<=n/2的所有節點依次做下墜調整(自底向上處理各分支節點),小元素逐層下墜(與關鍵字更大的孩子交換)

排序:將堆頂的元素加入有序子序列(堆頂元素與堆底元素交換),堆底元素換到堆頂後,需要進行下墜調整,恢復大根堆的特性,重複上述過程n-1趟。

(2)演算法效能:

空間複雜度:O(1) 時間複雜度O(n*logn)

(3)穩定性:不穩定

(4)演算法實現:

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
void HeapSort(int A[],int len);
void HeadAdjust(int A[],int k,int len);
int main(){
	int A[MAX];
	int i,k,len;
	printf("請輸入結點個數:\n");
	scanf("%d",&len);
	printf("請輸入資料:\n");
	for(i=0;i<len;i++)
		scanf("%d",&A[i]);
	HeapSort(A,len);
	printf("堆排序的結果為:\n");
	Printfarry(A,len);
	return 0;
	
} 
void HeadAdjust(int A[],int k,int len){
	int q,temp;
	temp=A[k];
	while((q=2*k+1)<len){
		if(q<len-1&&A[q]<A[q+1])
		q++;
		if(temp<A[q])
		{
			A[(q-1)/2]=A[q];
			k=q;
		}
		else
		break;
	}
	A[(q-1)/2]=temp;
	
}
void HeapSort(int A[],int len){
	int i,k,temp;
	i=(len-1)/2;
	while(i>=0){
		HeadAdjust(A,i,len);
		i--;
	}
	i=len-1;
	while(i>0){
		temp=A[0];
		A[0]=A[i];
		A[i]=temp;
		HeadAdjust(A,0,i);
		i--;
	}
}
void Printfarry(int A[],int n){
	int i;
	for(i=0;i<n;i++)
	{
		printf("%d\n",A[i]);
	}
	return;
	 } 

在這裡插入圖片描述

相關文章