八大內部排序演算法

2021-07-04 14:43:23 字數 2625 閱讀 5672

八大內部排序包括:

l插入排序:

直接插入排序

希爾排序(又稱增量排序)

l選擇排序:

簡單選擇排序

堆排序l交換排序:

氣泡排序

快速排序

l歸併排序

l基數排序(又稱桶排序)

排序演算法解析:

1、 直接插入排序與希爾排序

直接排序與希爾排序同屬於插入排序,不一樣的是,直接排序每次將tmp元素與前面所有的元素進行比較,直到到第乙個元素或者當前元素不大於tmp;而希爾排序每次講tmp元素與前面每隔增量個元素進行比較,直到第乙個元素或者當前元素不大於tmp。

直接插入排序**如下:

void insertsort( elemtype *arr, int num )

}

希爾排序**如下:

void shellpass( elemtype*, int, int );

void shellsort( elemtype *arr, int num )

}void shellpass( elemtype *arr, int num, int incre )

//if( j != i - incre )//存在比arr[i]小的數,這個實際上加不加都是可以的

arr[j + incre] = tmp;

}}

2、 選擇排序

選擇排序每次選擇剩下未排序的所有元素中最小的元素。

簡單排序每次需要表裡剩下的所有元素以獲得最小元素,堆排序只需要構建乙個最小堆,每次獲得堆得根節點,並調整二叉堆即可。

具體簡單選擇排序**如下:

int findmin( elemtype *, int, int);

void choosesort( elemtype *arr, int num )

}int findmin( elemtype *arr, int start, int end )

} return min_pos;

}

堆排序演算法(暫定)

3、 交換排序

交換排序包括氣泡排序與快速排序。

氣泡排序可以設定乙個哨兵判斷乙個交換過程是否發生交換,如果沒有發生交換,說明剩下的資料已經排好序了。

快速排序最重要的是partition過程,該過程中的i位置表示第i個位置之前的所有元素都小於tmp, j表示遍歷到的位置。

氣泡排序**如下:

void bubblesort( elemtype *arr, int num )

} }}

快速排序**如下:

int partition( elemtype *, int, int );

//void exchange(elemtype *, elemtype * );

//在pre < end的前提下進行排序的

void quicksort( elemtype *arr, int pre,int end )

}//快排最重要的部分, i表示最後乙個比tmp小的元素的方位, j表示遍歷方位

int partition( elemtype *arr, int begin, int end)

} elemtype t;

t = arr[i+1];

arr[i+1] = arr[end];

arr[end] = t;

return i+1;

}

4、 歸併排序

歸併排序是典型的二分法(分治法)排序演算法,首先將兩個子串行分別排好序,然後合併上述已經排好序的兩個子串行,在這裡需要開闢乙個陣列,以便在合併兩個排好序的子串行的時候排序,接著把排好序的元素複製到原始陣列中。

歸併排序**如下:

elemtype tmparr[max_size];//申請乙個全域性陣列,儲存交換後的資料

void merge( elemtype*, int , int, int );//合併陣列

void mergesort( elemtype *arr, int first, int end )

void merge( elemtype *arr, int first, int mid, int end )

else

}while( i <= mid )

tmparr[t++] = arr[i++];

while( j <= end )

tmparr[t++] = arr[j++];

for( int k = first; k <=end; ++k )

arr[k] = tmparr[k];

}

5、 基數排序(暫定)

八大內部排序

排序,就是重新排列表中的元素,使得表中元素滿足按關鍵字有序的過程。排序有許多種,常用的八大內部排序為氣泡排序 插入排序 選擇排序 希爾排序 快速排序 歸併排序 基數排序 堆排序 這幾種排序沒有絕對的優劣,每種排序都有他們適用範圍 氣泡排序每一趟排序可以確定乙個元素的最終位置,若一次掃瞄並沒有元素進行...

八大內部排序

先來看看8種排序之間的關係 一 直接插入排序 如下 1 public void inerrtsort int a 10 a j 1 tem 11 12 看起來簡單 實則有太多細節 二 希爾排序 public void shellsort int list list j gap temp 縮小增量 g...

八大內部排序 歸併排序

歸併排序 merge sort 將兩個或兩個以上的有序列表組合成乙個新的有序表,合併的m,n長度的兩個表的複雜度為o m n n個數的序列進行歸併共有ceil logn 次,每一次合併都是n常數級別的,所以總的複雜度為o nlogn 同時歸併排序是一種穩定的排序。如下,採用的是利用遞迴的方式書寫,要...