演算法學習之選擇排序和堆排序:
演算法學習之選擇排序和堆排序:
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排序演算法
- 【一起學習排序演算法】3 選擇排序排序演算法
- 排序演算法總結之堆排序排序演算法
- 排序演算法之冒泡,選擇,插入和希爾排序演算法
- Python排序演算法之 選擇排序Python排序演算法
- 排序演算法入門之「選擇排序」排序演算法
- 排序演算法 - 氣泡排序和選擇排序排序演算法
- 【小小前端】前端排序演算法第三期(不簡單選擇排序-堆排序)前端排序演算法
- 排序演算法之「選擇排序(SelectionSort) 」排序演算法
- 排序演算法總結之直接選擇排序排序演算法
- 重學資料結構和演算法(四)之氣泡排序、插入排序、選擇排序資料結構演算法排序
- 排序之選擇排序排序
- 排序演算法__堆排序排序演算法
- 排序演算法-堆排序排序演算法
- 排序演算法 - 堆排序排序演算法
- 排序演算法__選擇排序排序演算法
- 排序演算法:選擇排序排序演算法
- 畫江湖之演算法篇【排序演算法】選擇排序演算法排序
- 畫江湖之演算法篇 [排序演算法] 選擇排序演算法排序
- 夯實基礎:排序演算法之堆排序排序演算法
- 啊哈C——學習6.6選擇排序排序
- 演算法導論學習之三:排序之C語言實現:選擇排序,插入排序,歸併排序演算法排序C語言
- 堆排序演算法排序演算法
- #排序演算法#【3】堆排序排序演算法
- 選擇排序和快速排序排序
- 複習資料結構:排序演算法(六)——堆排序資料結構排序演算法
- 程式猿修仙之路--演算法之選擇排序演算法排序
- PHP基礎演算法之選擇排序法PHP演算法排序
- 排序演算法入門:選擇排序排序演算法
- 排序演算法——簡單選擇排序排序演算法
- 常用演算法-選擇排序演算法排序
- java選擇排序演算法Java排序演算法
- 選擇排序和氣泡排序排序
- 氣泡排序和選擇排序排序
- 選擇排序和插入排序排序
- 演算法基礎:排序演算法:選擇排序演算法排序
- JAVA小練習氣泡排序,選擇排序和插入排序Java排序