#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 輪要進行...