八種常用排序演算法

2021-07-05 00:24:12 字數 3346 閱讀 7820

#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[i]放到正確位置上 這裡的原來等於j = i-1;

}//4 依次遍歷第二個以後的元素,重複上述操作

}}//基本有序 記錄數少  比較快  n^2  分個小組就可以形成這樣的條件了

//3 希爾

void shell(int array,int n)//希爾排序是插入排序的優化版

array[j+d] = temp;}}

}while(d>1);

}//4 選擇:依次找出最小值從下標0開始存放

void selection(int *data,int len)

if(data[min]!=data[i])}}

//5 快排

void quick(int *data,int left,int right)

while(p=pivot)

j--;

if(pdata[p]=data[j];//如果比基準值小則把此元素放在當前p指向的位置(這個位置的值要把基準值小)

p=j;

}data[p]=pivot;//還原基準值 

if(p-left>1)//p在基值右邊

quick(data,left,p-1);

if(right-p>1)

quick(data,p+1,right);}}

//將有二個有序數列a[first...mid]和a[mid...last]合併。  

歸併  該演算法是採用分治法

void mergearray(int a, int first, int mid, int last, int temp)        

while (i <= m)  //其他已有序的元素插入到之前有序數列

temp[k++] = a[i++];       

while (j <= n)  

temp[k++] = a[j++];       

for (i = 0; i < k; i++)  //處理完畢的臨時陣列進行複製到原陣列

a[first + i] = temp[i];  

} 遞迴排序 

void mergesort(int a, int first, int last, int temp)  

} //7堆排序

// 堆 是乙個完全二叉樹

//堆排序樹形選擇排序在排序過程中,將r[l..n]看成是一棵完全二叉樹的順序儲存結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關係(rn<=r2n;rn<=k(2n+1);或者rn>=r2n;rn>=k(2n+1);),

//(由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案)

/* 1  將待排序的序列構造成堆結構(若想排序後為公升序,則構造成大頂堆,否則構造成小頂堆結構)

2  建堆完成,堆頂為整個序列的最大值,將堆頂元素與堆尾元素交換,則堆尾為最大值,再將其移走

3  將剩餘n-1個序列重新建堆,則可以依次得到每次新序列中的最大值

*///array是待調整的堆陣列,i是待調整的陣列元素的位置,nlength是陣列的長度

swap(int k,int i,int j)

void heapadjust(int array,int i,int nlength)

}// 7.3 排序堆

void heapsort(int array,int length)

}// 8 基數排序 基數排序的方式可以採用lsd(least significant digital)或msd(most significant digital),lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。lsd的基數排序適用於位數少的數列,如果位數多的話,使用msd的效率會比較好 缺點:空間利用率低,需於鍊錶結合進行優化

/* lsd:

73, 22, 93, 43, 55, 14, 28, 65, 39, 81

1 首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中

2 接下來將這些桶子中的數值重新串接起來,成為以下的數列

81, 22, 73, 93, 43, 14, 55, 65, 28, 39

接著再進行一次分配,這次是根據十位數來分配

3 接下來將這些桶子中的數值重新串接起來,成為以下的數列

14, 22, 28, 39, 43, 55, 65, 73, 81, 93

4 持續上述操作直到最高位*/

lsd

int maxbit(int data, int n)

}return d;

}void radixsort(int data, int n)

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

count[j] += count[j - 1]/*前面所有的記錄數*/; //調整桶號

for(j = n - 1; j >= 0; j--)

for(j = 0; j < n; j++) //根據低位到高位的調整(原陣列)

data[j] = tmp[j];

radix = radix * 10;}}

void print(int *data,int datalength)

}void getrandomnumber(int *data,int n)

}int main(void)

printf("\n");

// bubble(data,sizeof(data)/sizeof(int));

// insert(data,sizeof(data)/sizeof(int));

// selection(data,sizeof(data)/sizeof(int));

// quick(data,0,sizeof(data)/sizeof(int)-1);

// shell(data,sizeof(data)/sizeof(int));

// int temp[len];

// mergesort(data,0,sizeof(data)/sizeof(int)-1,temp);

// heapsort(data,sizeof(data)/sizeof(int));

radixsort(data,len);

print(data,sizeof(data)/sizeof(int));//下標為1開始 為堆頂

return 0;

}

Java常用八種排序演算法

1.直接插入排序 穩定 原理 將陣列分為無序區和有序區兩個區,然後不斷將無序區的第乙個元素按大小順序插入到有序區中去,最終將所有無序區元素都移動到有序區完成排序。要點 設立哨兵,作為臨時儲存和判斷陣列邊界之用。public class insertsort public static void in...

八種排序演算法

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

八種基本排序演算法

1 思路 對尚未排序的各元素從頭到尾依次比較相鄰的兩個元素是否逆序 與欲排順序相反 若逆序就交換這兩元素,經過第一輪比較排序後便可把最大 或最小 的元素排好 然後再用同樣的方法把剩下的元素逐個進行比較,就得到了你所要的順序 可以看出如果有 n 個元素,那麼一共要進行 n 1 輪比較,第 i 輪要進行...