void BubbleSort(int arr[],int size)

{

assert(arr);

int iBeign = 0;

int jBeign = 0;

int flag = 1;

int temp = 0;

for (iBeign = 1; (iBeign < size) && (flag == 1);iBeign++)

{

flag = 0;

for (jBeign = 0; jBeign < size - iBeign; jBeign++)

{

if (arr[jBeign] > arr[jBeign + 1])

{

flag = 1;

temp = arr[jBeign];

arr[jBeign] = arr[jBeign + 1];

arr[jBeign + 1] = temp;

}

}

}

}

void SelectSort(int arr[], int size)

{

assert(arr);

int iBeign = 0;

int jBeign = 0;

int Small= 0;

int temp = 0;

for (iBeign = 0; iBeign < size; iBeign++)

{

Small = iBeign;

for (jBeign = iBeign + 1; jBeign < size; jBeign++)

{

if (arr[jBeign] < arr[Small])

{

Small = jBeign;

}

}

if (Small != iBeign)

{

temp = arr[Small];

arr[Small] = arr[iBeign];

arr[iBeign] = temp;

}

}

}

void InsertSort(int arr[], int size)

{

assert(arr);

int iBeign = 0;

int jBeign = 0;

int key = 0;

for (iBeign = 1; iBeign < size; iBeign++)

{

key = arr[iBeign];

jBeign = iBeign - 1;

while ( (jBeign >= 0 ) && (key < arr[jBeign]) )

{

arr[jBeign + 1] = arr[jBeign];

arr[jBeign] = key;

jBeign--;

}

}

}

void Quick(int arr[], int low,int high)  //一趟快排

{

assert(arr);

int i = low;

int j = high;

int key = arr[low];

while (i < j)

{

while ((i < j) && (key < arr[j]))

{

j--;

}

if (i < j)

{

arr[i] = arr[j];

i++;

}

while ((i < j) && (key > arr[i]))

{

i++;

}

if (i < j)

{

arr[j] = arr[i];

j--;

}

}

arr[i] = key;

if (i > low)

{

Quick(arr, low , i - 1);

}

if (j < high)

{

Quick(arr, j + 1, high);

}

}

void QuickSort(int arr[], int size)

{    

     assert(arr);

Quick(arr, 0, size - 1);

}

int dlta[] = { 5, 3, 2, 1};  //增量序列

void ShellInsert(int arr[] ,int size ,int dk)

{

assert(arr);

int iBegin = 0;

int jBegin = 0;

int key = 0;

for (iBegin = dk; iBegin < size; iBegin++)

{

key = arr[iBegin];

jBegin = iBegin - dk;

while ((jBegin >= 0) && (key < arr[jBegin] ))

{

arr[jBegin + dk] = arr[jBegin];

arr[jBegin] = key;

jBegin -= dk;

}

}

}

void ShellSort(int arr[], int size,int t)

{

int i = 0;

for (i = 0; i < t;i++)

{

ShellInsert(arr, size, dlta[i]);

}

}

void Heapjust(int arr[], int size,int h)

{

assert(arr);

int i = h; 

int j = 2 * i + 1;

int key = arr[i];

int flag = 0;

while ( (j < size) && (flag != 1))

{

if ((j < size - 1) && (arr[j] < arr[j + 1]))   //建立大堆 注意点1

{

j++;

}

if (key > arr[j])     //注意点2

{

flag = 1;

}

else

{

arr[i] = arr[j];

i = j;

j = 2 * i + 1;

}

}

arr[i] = key;

}

void MinHeapInit(int arr[], int size)

{

assert(arr);

int i = 0;

for (i = (size - 2) / 2; i >= 0; i--)

{

Heapjust(arr, size, i);

}

}

void HeapSort(int arr[], int size)

{

assert(arr);

int i = 0;

int temp = 0;

MinHeapInit(arr, size);

for (i = size - 1; i >= 0; i--)

{

temp = arr[0];

arr[0] = arr[i];

arr[i] = temp;

Heapjust(arr, i, 0);

}

}

int TR[size] = { 0 };   //辅助归并排序开辟的空间,, 辅助存储 O(n)

//int arr[]  TR数组的大小要与要排序数组arr的大小一样

//Merging Sort(2- 路归并排序)

//有序的arr[start,...,mid]和arr[mid+1,...,end]归并为有序的TR[i,...,n]

void Merge(int arr[], int TR[],int start,int mid, int end)

{

assert(arr);

assert(TR);

int iBegin = start;

int jBegin = mid + 1;

int data = 0;

int iTR = start;

while ( (iBegin <= mid) && (jBegin <= end) )  //链表合并思想

{

if (arr[iBegin] > arr[jBegin])

{

data = arr[jBegin];

jBegin++;

}

else

{

data = arr[iBegin];

iBegin++;

}

TR[iTR++] = data;

}

while (iBegin <= mid)

{

TR[iTR++] = arr[iBegin++];

}

while (jBegin <= end)

{

TR[iTR++] = arr[jBegin++];

}

while (--iTR >= start)

{

arr[iTR] = TR[iTR];

}

}

//将arr[start,...,t]归并排序到TR[start,...,t]

void MSort(int arr[], int TR[], int start, int end) 

{

assert(arr);

assert(TR);

int mid = 0;

if (start == end)

{

return;

}

else

{

mid = (start + end) / 2;

MSort(arr, TR, start, mid);

MSort(arr, TR, mid + 1, end);

Merge(arr, TR, start, mid, end);

}

}

void MergeSort(int arr[],int TR[], int size)

{

assert(arr);

assert(TR);

MSort(arr, TR, 0, size - 1);

}