資料結構之排序(二)

2021-08-05 18:36:20 字數 2016 閱讀 4229

本次所介紹的排序分別是堆排序、歸併排序、快速排序。

void swap(int a,int i,int j);//交換下標為i和j的兩個元素的值

void printa(int a,int len);//列印陣列

堆排序:

堆排序是指利用堆這種資料結構所設計的一種排序演算法,它是選擇排序的一種。在從小到大排序中,需要使用的是大根堆,大根堆的要求是每個節點的值都不大於其父節點的值,根據大根堆的要求可知,最大的值一定在堆頂。這樣每次都可以找到待排序元素中最大元素。**如下:

//調整最大堆

void heapify (int *a,int i,int len)

if (right < len && a[right] > a[max]) //當前最大元素與右孩子比較

if (max != i) }

//排序

void heapsort (int *a,int len)

for (i = len - 1;i > 0;i--) }

int main()

; int len = sizeof(a) / sizeof(a[0]);

heapsort (a,len);

printa (a,len);

return 0;

}

歸併排序:

歸併排序是建立在歸併操作上的一種有效的排序演算法。先讓每個子串行有序,再將已有序的子串行合併,得到完全有序的序列。需要使用到遞迴,並且在合併時,需要建乙個緩衝區。**如下:

//歸併(合併)

void merge (int *a,int left,int right,int mid,int *tmp)

else

}//剩下的全部放入緩衝區

while(i <= mid)

while (j <= right)

k = 0;

for (i = left;i <= right;i++) //將緩衝區的值傳給陣列 }

//排序

void mergesort (int *a,int left,int right,int *tmp)

int mid = (left + right) / 2;

mergesort (a,left,mid,tmp); //歸併排序左邊

mergesort (a,mid + 1,right,tmp); //歸併排序右邊

merge (a,left,right,mid,tmp); //合併

}int main()

; int len = sizeof(a) / sizeof(a[0]);

int tmp[len];

mergesort (a,0,len - 1,tmp);

printa (a,len);

return 0;

}

快速排序:

快速排序的基本思想是選乙個基準值,通過一趟排序將要排序的資料分成兩部分,比基準值小的和比基準值大的分別放在基準值兩邊,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。快速排序是對氣泡排序的一種改進。**如下:

//分割槽操作,返回基準值下標

int partition (int * a,int left,int right)

} swap (a,index,right); //將基準值放到比它大的所有數左邊

return index;

}//排序

void qsort (int *a,int left,int right)

}int main()

; int len = sizeof(a) / sizeof(a[0]);

qsort (a,0,len - 1);

printa (a,len);

return 0;

}

有關排序的更多演算法和**實現以及更高效的排序,希望能與大家交流。

走進資料結構之排序(二) 希爾排序

希爾排序基本思想就是分組的直接插入排序!如何分組呢?希爾排序是以間距來分組的!那間距又如何取呢?希爾排序是以傳進來的資料序列的長度作為間距初始值的,每一趟排序都是將資料序列的一半作為間距來進行排序操作,直到間距取為1,停止排序。有了間距又如何來排序呢?其實就是分組的直接插入排序,只是直接插入排序的間...

資料結構之排序(二) 歸併排序

其思想說白了就是先分後合,先將需要排序的陣列迭代或遞迴每次分成兩份直到分成n個數為止,然後再將n個數涼兩兩排序後合併成n 2個陣列,以此類推直到合併排序成乙個陣列。1 中採用的是線性表的順序儲存結構來存放資料的 typedef void list node 用於復用加入元素 typedef unsi...

資料結構 排序(二)

歸併排序最壞情況下時間複雜度為o nlogn 它所使用的比較次數幾乎是最優的。同時歸併排序是分治策略和遞迴策略的乙個非常好的例項。歸併排序的基本操作是合併兩個已經排序的表。對於乙個要排序的陣列,歸併演算法首先將陣列分為兩部分,然後分別對這兩部分遞迴呼叫自己,這個遞迴演算法的遞迴終止條件是陣列長度為一...