近幾天在學習簡單算法,今天看了一個快速排序和堆排序,堆排序還沒搞懂,還是先把快速排序搞清楚吧
教程網上一艘一大堆,這里選擇一個講的比較通俗的的一個吧:
http://blog.csdn.net/morewindows/article/details/6684558 感謝博主。
四種排序算法的比較
冒泡排序是最慢的排序算法。在實際運用中它是效率最低的算法。它通過一趟又一趟地比較數組中的每一個元素,使較大的數據下沉,較小的數據上升。
插入排序通過將序列中的值插入一個已經排好序的序列中,直到該序列結束。插入排序是對冒泡排序的改進。它比冒泡排序快兩倍。一般不用在數據的值大於 1000 的場合,或數據的個數超過 200 的序列。
選擇排序在實際應用中處於與冒泡排序基本相同的地位。它們只是排序算法發展的初級階段,在實際中使用較少。但是它們最好理解。
快速排序是大規模遞歸的算法,它比大部分排序算法都要快。一般用於數據個數比較多的情況。盡管可以在某些特殊的情況下寫出比快速排序快的算法,但是就通常情況而言,沒有比它更快的了。快速排序是遞歸的,對於內存非常有限的機器來說,它不是一個好的選擇。
#include <stdio.h> #include <stdlib.h> /* 快速排序算法學習 */ void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } void quickSort(int arr[] ,int start, int end) { int arrBase, arrMiddle; int tempStart = start, tempEnd = end; //對於這種遞歸的函數,內部必須要有一個函數返回的條件 if(tempStart >= tempEnd) return; //拷貝一個基准值作為后面比較的參數 arrBase = arr[start]; while(start < end) { while(start < end && arr[end] > arrBase) end--; if(start < end) { swap(&arr[start], &arr[end]); start++; } while(start < end && arr[start] < arrBase) start++; if(start < end) { swap(&arr[start], &arr[end]); end--; } } arr[start] = arrBase; arrMiddle = start; //分治方法進行遞歸 quickSort(arr,tempStart,arrMiddle-1); quickSort(arr,arrMiddle+1,tempEnd); } int main() { int myArr[] = {12,13,15,20,0,-1,-10,100}; int arrLength = sizeof(myArr)/sizeof(int); quickSort(myArr,0,arrLength-1); for(int i = 0; i<arrLength; i++) printf("%5d",myArr[i]); return 0; }
