八種基本排序演算法

2021-05-26 08:26:02 字數 4184 閱讀 8343

/*

1、思路:

對尚未排序的各元素從頭到尾依次比較相鄰的兩個元素是否逆序(與欲排順序相反)

若逆序就交換這兩元素,經過第一輪比較排序後便可把最大(或最小)的元素排好

然後再用同樣的方法把剩下的元素逐個進行比較,就得到了你所要的順序

可以看出如果有 n 個元素,那麼一共要進行 n-1 輪比較,第 i 輪要進行 j=n-i 次比較。

2、平均時間複雜度

o(n2)

3、平均空間時間複雜度

原地排序

4、穩定性

穩定*/

void testbubblesort(int *pdata, int icount)

}//endfor

}//endfor}/*

1、思路:

插入排序的基本操作就是將乙個資料插入到已經排好序的有序資料中,從而得到乙個新的、個數加一的有序資料

每次處理就是將無序數列的第乙個元素與有序數列的元素從後往前逐個進行比較,找出插入位置,

將該元素插入到有序數列的合適位置中

2、平均時間複雜度

o(n2)

3、平均空間時間複雜度

原地排序

4、穩定性

穩定*/

void testinsertsort(int *pdata, int icount)

else

}//endwhile

pdata[ipos + 1] = itemp;

}//endfor}/*

1、思路:

首先在所有的記錄中選出鍵值最大的記錄,把它與最後乙個記錄交換;

然後在其餘的記錄中再選出鍵值最大的記錄與倒數第二個換

依此類推,直至所有記錄排序完成。

在第i趟中,通過n-i次鍵值比較選出所需記錄

2、平均時間複雜度

o(n2)

3、平均空間時間複雜度

原地排序

4、穩定性

不穩定*/

void testselectsort(int *pdata, int icount)

}//endfor

if (i != imaxpos)

}//endfor}/*

1、思路:

首先在數列中找出適當的軸心,將數列分成左右兩部分,保證數列左半部分的元素都小於右半部分的元素,

然後分別對兩部分進行排序,即重複選擇軸心,劃分左右部分的過程。

2、平均時間複雜度

o(n log n)

3、平均空間時間複雜度

原地排序

4、穩定性

不穩定*/

void testquicksort(int *pdata, int ileft, int iright)

int i = ileft;

int j = iright;

int ibaselinevalue = pdata[ileft];

while(i < j)

while(j > ileft && pdata[j] > ibaselinevalue)

int itemp = 0;

if (i <= j)

}//endwhile

if (ileft < i)

if (j < iright)

}void merge(int *padata, int ileft, int imid, int iright, int *pcdata)

else

}//endwhile

while (ia <= imid)

while(ib <= iright)

int ipos = 0;

for (ipos = ileft; ipos <= iright; ipos++)

//endfor}/*

1、思路:

歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,

即把待排序序列分為若干個子串行,每個子串行是有序的。

然後再把有序子串行合併為整體有序序列。

2、平均時間複雜度

o(n log n)

3、平均空間時間複雜度

o(n)

4、穩定性

穩定*/

void testmergesort(int *padata, int ileft, int iright, int *pcdata)

else

}int left(int i)

int right(int i)

void max_heapify(int *pdata, int icount, int i)

if ((iright <= icount - 1) && (pdata[iright] > pdata[ilargest]))

if (ilargest != i)

}void build_max_heap(int *pdata, int icount)}/*

1、思路:

堆排序利用了大根堆(或小根堆)堆頂記錄的關鍵字最大(或最小)這一特徵,

使得在當前無序區中選取最大(或最小)關鍵字的記錄變得簡單。

找到數列中最大的數字,將其加在"有序列表"的末尾,並將其從原數列中刪除。

重複2號步驟,直至原數列為空。

2、平均時間複雜度

o(n logn)

3、平均空間時間複雜度

原地排序

4、穩定性

不穩定*/

void testheapsort(int *pdata, int icount)

}int maxbit(int *pdata, int icount) //輔助函式,求資料的最大位數

//endfor

for(int i = 0; i < icount; i++)

if(imaxbit < p+1) imaxbit = p+1;

}return imaxbit;}/*

1、思路:

基數排序的主要思路是,將所有待比較數值(注意,必須是正整數)統一為同樣的數字長度,

數字較短的數前面補零. 然後, 從最低位開始, 依次進行一次穩定排序.

這樣從最低位排序一直到最高位排序完成以後, 數列就變成乙個有序序列

2、平均時間複雜度

o(n)

3、平均空間時間複雜度

o(n)

4、穩定性

穩定*/

void testradixsort(int *pdata, int icount) //基數排序

for(j = 0; j < icount; j++)

for(j = 1; j <= 10; j++)

for(j = icount-1; j >= 0; j--) //將所有桶中記錄依次收集到tmp中

for(j = 0; j < icount; j++) //將臨時陣列的內容複製到data中

radix = radix*10;}}

/*1、思路:

提出的「縮小增量」的排序方法。

它的作法不是每次乙個元素挨乙個元素的比較。

而是初期選用大跨步(增量較大)間隔比較,使記錄跳躍式接近它的排序位置;

然後增量縮小;最後增量為 1 ,這樣記錄移動次數大大減少,提高了排序效率

2、平均時間複雜度

o(n log n)

3、平均空間時間複雜度

原地排序

4、穩定性

不穩定*/

void testshellsort(int *pdata, int icount)

; int itemp = 0;

int k = 0, s = 0, w = 0;

for(int i = 0; i < 4; i++)

while((itemp < pdata[w]) && (w >= 0) && (w <= icount))

pdata[w+k] = itemp; } }

} //主函式

void main()

;// testbubblesort(a, 10);

// testinsertsort(a, 10);

// testselectsort(a, 10);

// testquicksort(a, 0, 9);

// testmergesort(a, 0, 9, c);

// testheapsort(a, 10);

// testradixsort(a, 10);

testshellsort(a, 10);

}

八種基本排序演算法 java實現

將陣列公升序排列 思路 將乙個記錄插入到已排序好的有序表中,從而得到乙個新,記錄數增1的有序表。即 先將序列的第1個記錄看成是乙個有序的子串行,然後從第2個記錄逐個進行插入,直至整個序列有序為止。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。2.直接插入排序 public static void ...

八種排序演算法

include include 氣泡排序 void boblesort int arr,int n 插入排序 void insertsort2 int arr,int n 希爾排序 void shellsort2 int arr,int n 選擇排序 void selectsort int arr,...

八種常用排序演算法

include include include define len 10 1 冒泡 將序列每輪找出的最大值從下標n到0依次存放 void bubble int data,int len 2 直插 void insert int array,int n array j 1 temp 3 將array...