常見的排序演算法

2021-09-25 19:43:46 字數 2856 閱讀 1087

思路:需要用n-1個迴圈,每個迴圈都從第1個數開始向後遍歷,遇到無序的一對數則交換這兩個數,第1次遍歷完成後,第n個數有序,下次只需要遍歷到第n-1個數。以此類推,第n-1次遍歷完成後,從第2個數到第n個數有序,只剩乙個數一定是有序的,所以整個陣列有序。

**:

void bubblesort(int *arr, int len)

}}

思路:第一次遍歷先選出最小的數,把它和第乙個數交換,那麼第乙個數就有序了,第二次遍歷從第二個數開始,此時選出的最小值和第二個位置的數交換,則前兩個數有序。以此類推,直到倒數第二個數有序,則整個陣列有序。

**:

void selectsort(int *arr, int len)

swap(arr[i],arr[min_pos]);

}}

思路:總的來說,就是在前k個數里,把第k個數放到它正確的位置。

那麼,前乙個數的位置一定是對的,從第二個數開始,在前兩個數里找到第二個數正確的位置,以此類推。實現時,需要先把第k個數記錄下來,然後從後往前尋找,在找到正確位置之前經過的所有數都應該向後移一位,找到後進行賦值。每次遍歷都使得前k個數有序,遍歷完成時整個陣列就有序了。

**:

void insertsort(int *arr, int len)

arr[j+1]=tmp;

}}

思路:希爾排序實際上就是插入排序的一種優化,由於插入排序中,原陣列越有序,排序效率越高,所以希爾排序通過分組的方式,使得原陣列更加有序之後再進行插入排序。

希爾排序會用到分組的增量陣列,也就是分組時的依據,比如陣列中第乙個數是5,那麼第一次分組時,就會將下標為0、5、10、…的數分為一組,1、6、11、…的數分為第二組,以此類推,所以要保證陣列最後乙個元素是1,使得最後一次分組是整個陣列在一起,那麼最後一次插入排序就可以使整個陣列有序。(這裡的陣列有書上說最好是質數陣列,我還不知道原因,如果有人看到可以告訴我。蟹蟹辣。)

**:

void shell(int *arr, int len, int p)

arr[j + p] = tmp;

}}void shellsort(int *arr, int len)

;//增量陣列,具體可以根據原陣列元素個數來確定

for(int i=0;part_len[i]>=1;i++)

}

思路:快速排序的思想可以概括為「 將每乙個數字放在它正確的位置上 」,那麼所謂正確的位置,就是保證它前面的所有數字都比它小,後面的數字都比它大。

實現起來就是先將第乙個數字記下來,從後向前找到第乙個比它小的數字放在它原本的位置,再從前往後找到第乙個比它大的數字放在剛才空出來的位置,然後再重複前面的操作,直至將整個陣列遍歷完,最後乙個空出來的位置用一開始記下來的值填上。(這裡所謂空出來的位置,就是將值賦給過其他位置的地方,由於值不會丟失,所以可以當作空位。)第一次遍歷完後,可以得到乙個已經找到正確位置的值假設為第k個數,那麼使k的左右兩部分(兩個數以上做這個操作)分別遞迴再次執行上述過程。遞迴結束時整個陣列就是有序的。

**:

void quick(int *arr, int low, int high)

void quicksort(int *arr, int len)

思路:堆排序使用了資料結構中的最大堆結構,即乙個二叉樹中每個樹的根節點都是這個樹里的最大值,那麼我們要做的第一件事就是把原本按照下標排成的二叉樹修改為最大堆。修改的實現,是從最下面的最右邊第一顆二叉樹向左向上依次遍歷,在每個二叉樹中將最大值換到根節點上,遍歷完成後這棵樹就是最大堆。然後我們將整棵樹的根節點,也就是這個陣列中的最大值,和最後乙個節點交換位置,然後最後乙個節點不動,對其他節點再次進行修改,變成一顆最大堆,以此類推。

**:

void heaponce(int *arr, int i, int len)

else

break;

} arr[i]=tmp;

}void createheap(int *arr, int len)

}void heapsort(int *arr, int len)

}

思路:歸併排序還是將陣列分為小組排序。第一次排序先對下標0和1排,然後2和3排,直到結尾,完成之後陣列變為len/2個有序的陣列,每個陣列內最多只有兩個元素。第二次就對第

一、二小組進行排序,以此類推。那麼最後一次排序就是對整個陣列的前半部分和後半部分就行排序,完成後整個陣列有序。

**:

void merge(int *arr, int len, int width, int *tmp)//一次排序

//結束是因為其中乙個小佇列左界越過右界

//處理剩下的元素

if(l1<=h1)arr[pos++]=arr[l1++];

if(l2<=h2)arr[pos++]=arr[l2++];

//準備排下一組的兩個小佇列

l1=h2+1;

h1=l1+width-1l2=h1+1;

h2=l2+width-1}//大迴圈結束時一定是l2越界,l1可能越界也可能還沒有越界

while(l1tmp[pos++]=arr[l1++];

for(int i=0;iarr[i]=tmp[i];

}void mergesort(int *arr, int len)

deletetmp;

}

常見的排序演算法

一 氣泡排序 include include void swap int a,int b void bubblesort int arr,int size int main void bubblesort a,5 for int i 0 i 5 i cout 二 選擇排序 void selectio...

常見的排序演算法

需要包含的標頭檔案 include stdafx.h include include include 氣泡排序是穩定排序 時間複雜度 o n 2 void swap int a,int b void bubblesort int a,int n void printnum int a,int n a...

常見的排序演算法

排序演算法是最基礎,也是最簡單的演算法思想,因為應用場景多,書寫簡單,所以應用較為普遍,所以在面試和考試的時候,都會涉及到排序演算法,雖然排序演算法種類很多,但是只要理解了思想,然後靈活運用,那麼就不難記憶.排序演算法兩個需要記憶和理解的點就是 演算法思想和時間複雜度.下面我們就介紹和分析一下常見的...