o(n^2)的有:氣泡排序、插入排序、選擇排序;
o(nlogn)的有:快排、歸併排序、堆排序;
氣泡排序:原理是無序區兩兩比較,每趟得到乙個最大的放在無序區最後;
演算法:外迴圈是趟數[0,n-1), 內迴圈是無序區個數[0, n-i-1);迴圈體是比較[j]和[j+1];
插入排序:是把陣列分成有序區和無序區兩部分,每次從無序區取出一位作為tar值,從後向前遍歷有序區,大於tar則後移,最後放到目標位置;
演算法:外迴圈是無序區長度[1,n);定義a[i]為tar值;內迴圈j指向i,比較a[j-1]與tar,大於則往後順移a[j-1];最後a[j]賦值;
選擇排序:也是分為有序區和無序區,每次從無序區選擇一位最小的放到有序區末尾;
演算法:外迴圈是趟數[0,n-1), 內迴圈是無序區個數[i+1,n);迴圈體是比較[i]和[j];
快排:每次排序確定乙個數的位置,比該數小的移到左邊,大的移到右邊。一趟快排的演算法是:
上述過程就是partition函式;以partition函式返回的位置,對左右兩邊遞迴。
演算法:(如上)partition(a,lo,hi)函式:定義key,while迴圈(lo=key);最後a[lo]賦值,返回lo; sort(a,lo,hi)函式:判斷(lo歸併排序:將陣列分成若干個小陣列,將已有序的陣列兩兩歸併得到完全有序陣列。每趟歸併的演算法是:
演算法:merge(a,lo,mid,hi)方法:tmp陣列,左右指標+臨時指標,比較兩陣列小的儲存,儲存剩餘陣列,賦值陣列;mergesort(a,lo,hi) mid, if()判斷:左右遞迴,merge();注意左右遞迴一定是左邊(lo,mid),右邊(mid+1, hi);因為mid偏左,不然會死迴圈。
堆排序:堆排序包括兩個過程,首先是根據元素建堆,時間複雜度o(n),然後將堆的根節點取出(與最後乙個節點交換),將前面n-1個節點進行堆調整。直至所有節點都取出。堆調整時間複雜是o(lgn),呼叫了n-1次,所以堆排序時間複雜度是o(nlgn);
排序演算法總結
1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...
排序演算法總結
1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...
排序演算法總結
學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...