資料結構C語言版堆排序

2021-08-29 23:15:41 字數 3435 閱讀 3624

堆排序的由來還得說到簡單選擇排序,由簡單選擇排序中的在進行剩餘的n -2個資料比較時若能利用前n-1次比較的所得資訊,則可以減少以後各趟排序的比較次數,由此聯想出錦標賽排序也就是樹形排序,但是樹形排序的輔助儲存空間較多,和「最大值」進行比較多餘的比較等缺點,因此,在2023年威洛姆斯提出了堆排序,堆排序靈活的應用了最堆的特性來達到選擇的目的。

堆排序只需要乙個記錄大小的輔助空間,每個待排序的記錄僅占有乙個儲存空間。

然後是在輸出堆頂元素後再次調整剩餘元素為乙個新的最堆這個過程也叫作「篩選」。

**:sort.h

#pragma once

#include

#include

#include

#define n 10

void

inputdata

(int

* d)

;//輸入資料

void

printdata

(int

* d)

;//輸出資料

void

insertsort

(int

* d)

;//直接插入排序

void

shellsort

(int

* d,

int length)

;//希爾排序

void

selectsort

(int

* d,

int len)

;//選擇排序

typedef

int hpdatatype;

typedef

struct heap

heap,

*pheap;

//建立堆

void

heapsort

(hpdatatype* d,

int n)

;//堆排序

pheap heapcreat

(hpdatatype* d,

int n)

;//建立大堆

void

heapdestory

(pheap hp)

;//銷毀堆

void

(heap hp)

;//堆列印

void

adjustdown

(hpdatatype* a,

int n,

int root)

;//堆內滲透函式

sort.c

#include

"sort.h"

void

inputdata

(int

* d)

printf

("\n\n");

}void

printdata

(int

* d)

printf

("\n\n");

}void

swap

(int

* d1,

int*d2)

//直接插入排序

//假設待排序的記錄存放在陣列d[0..n-1]中。

//初始時,d[0]自成1個有序區,無序區為r[1.n-1]。

//從i=1起直至i=n-1為止,依次將d[i]插入當前的有序區d[1..n-1]中,

//生成含n個記錄的有序區。

void

insertsort

(int

* d)

right--;}

}printf

("排序成功!\n\n");

}//insertsort

//基礎:插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率。

//通過分組使陣列漸變有序

//最後在直接插入排序

void

shellsort

(int

*d,int length)

//希爾排序

d[j + gap]

= temp;

//填補上乙個分組的相應位置元素}}

printf

("排序成功!\n\n");

}//shellsort()

intselectminkey

(int

* d,

int i,

int len)

}return min;

}void

selectsort

(int

* d,

int len)

//選擇排序

}printf

("排序成功!\n\n");

}//selectsort();

void

heapsort

(hpdatatype* d,

int n)

//堆排序

//向下調整為大堆

for(i =

((n -2)

/2); i >=0;

--i)

printf

("大堆:");

for(i =

0; i < hp.num; i++

)printf

("\n\n");

//排序

int end = hp.num;

while

(end >=0)

printf

("排序後:");

for(i =

0; i <= hp.num; i++

)printf

("\n\n");

}void

adjustdown

(hpdatatype* a,

int n,

int root)

//堆內滲透函式

if(a[child]

> a[parent]

)else

}}

main.c

#include

"sort.h"

void

test()

;/*int d[n];

inputdata(d);*/

printdata

(d);

/*insertsort(d);

printdata(d);*/

/*shellsort(d, sizeof(d)/sizeof(d[0]));

printdata(d);*/

/*selectsort(d, sizeof(d) / sizeof(d[0]));

printdata(d);*/

heapsort

(d,sizeof

(d)/

sizeof

(d[0])

);}int

main()

資料結構(C語言版) 排序

1 排序 重排表中元素。2 根據資料元素是否完全在記憶體中,將排序演算法分為內部排序和外部排序兩類。3 插入排序 將乙個待排序記錄按關鍵字大小插入到前面已排好的子串行中,直到全部記錄插入完成。1 直接插入排序 void insertsort sqlist l l.r j 1 l.r 0 1 空間複雜...

資料結構(C語言版)

用棧實現數字的進製轉換 10轉8 棧 限定只能在表尾進行插入或者刪除操作的線性表 特點 先進後出 儲存表示方法 順序棧和鏈棧 本文用的順序棧 實現 readonly name code class c include include define stack init size 100 儲存空間初始...

《資料結構(C語言版)》綜述

第一章 緒論 將於4月20日學習完畢,含課後題以及資料練習題 1.1什麼是資料結構 1.2基本概念和術語 1.3抽象資料結構型別的表示與實現 1.4演算法和演算法分析 1.4.1演算法 1.4.2演算法設計的要求 1.4.3演算法效率的度量 第二章 線性表 2.1線性表的型別定義 2.2線性表的順序...