演算法學習之選擇排序和堆排序:
演算法學習之選擇排序和堆排序:
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;
}
相關文章
- PHP 排序演算法之選擇排序PHP排序演算法
- Python排序演算法之 選擇排序Python排序演算法
- 排序演算法之「選擇排序(SelectionSort) 」排序演算法
- 【一起學習排序演算法】3 選擇排序排序演算法
- 排序演算法入門之「選擇排序」排序演算法
- 排序演算法 - 氣泡排序和選擇排序排序演算法
- 【小小前端】前端排序演算法第三期(不簡單選擇排序-堆排序)前端排序演算法
- 重學資料結構和演算法(四)之氣泡排序、插入排序、選擇排序資料結構演算法排序
- 排序演算法__堆排序排序演算法
- 排序演算法 - 堆排序排序演算法
- 排序演算法-堆排序排序演算法
- 夯實基礎:排序演算法之堆排序排序演算法
- 畫江湖之演算法篇【排序演算法】選擇排序演算法排序
- 畫江湖之演算法篇 [排序演算法] 選擇排序演算法排序
- 排序演算法:選擇排序排序演算法
- 排序演算法__選擇排序排序演算法
- 選擇排序和快速排序排序
- PHP基礎演算法之選擇排序法PHP演算法排序
- 程式猿修仙之路--演算法之選擇排序演算法排序
- 排序演算法入門:選擇排序排序演算法
- (建議收藏)2020最新排序演算法總結:冒泡、選擇、插入、希爾、快速、歸併、堆排序、基數排序排序演算法
- 常用演算法-選擇排序演算法排序
- java選擇排序演算法Java排序演算法
- 選擇排序和氣泡排序排序
- 演算法基礎:排序演算法:選擇排序演算法排序
- 經典排序之選擇排序(Java)排序Java
- 排序——選擇排序小練習(二)排序
- 排序——選擇排序小練習(一)排序
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- C#堆排序演算法C#排序演算法
- 圖解堆排序演算法圖解排序演算法
- Python 一網打盡<排序演算法>之堆排序演算法中的樹Python排序演算法
- 演算法與資料結構之原地堆排序演算法資料結構排序
- C#實現——十大排序演算法之選擇排序C#排序演算法
- 資料結構學習筆記-堆排序資料結構筆記排序
- 深入淺出的排序演算法-選擇排序排序演算法
- 基礎排序(冒泡、選擇、插入)學習筆記排序筆記
- 堆排序和快速排序效能比較排序