#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define ARRAYSIZE 10
int data[ARRAYSIZE];
void initData()
{
int i = 0;
srand((int)time(0));
for(;i<ARRAYSIZE;i++)
{
data[i] = (int)(100*rand()/(RAND_MAX + 1.0)) + 1;
}
}
void printData(char *string)
{
int i = 0;
printf("%s\n",string);
for(;i<ARRAYSIZE;i++)
{
printf("%-4d",data[i]);
}
printf("\n");
}
void swap(int i,int j)
{
int temp;
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
/*直接插入排序。从第一个元素开始,形成长度为1,2,3乃至N的有序数组,
选取第N+1个元素插入到有序数组中,直到最后一个元素,从而形成有序排列的数组*/
void DirectInsertSort(int data[], int length)
{
int index = 1;
int left;
int temp;
while(index < length)
{
left = index - 1;
temp = data[index];
if(temp > data[index-1])
{
index++;
continue;
}
else
{
while(left >= 0 && data[left] > temp)
{
data[left+1] = data[left];
left--;
}
data[left+1] = temp;
index++;
}
}
}
/*冒泡排序。如其名,从第一个元素开始,依次比较相邻的两个元素
并始终保证较大的元素在右侧,从而通过一次次的排序将大元素放在右侧小元素放在左侧。*/
void BubbleSort(int data[], int length)
{
int index = length - 1;
int i;
int flag = -1;
while(index > 1)
{
for(i = 0;i < index;i++)
{
if(data[i] > data[i+1])
{
swap(i,i+1);
flag = 1;
}
}
index--;
if(flag==-1)
break;
}
}
/*选择排序。顾名思意,就是直接从待排序数组里选择一个最小(或最大)的数字,
每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完*/
void SelectSort(int data[], int length)
{
int index = 0;
int temp;
int min;
int minIndex;
while(index < length)
{
temp = index;
min = data[temp];
for(;temp<length;temp++)
{
if(data[temp] < min)
{
min = data[temp];
minIndex = temp;
}
}
data[minIndex] = data[index];
data[index] = min;
index++;
}
}
/*快速排序*/
void QuickSort(int data[],int left,int right)
{
int i = left;
int j = right;
int base;
if(left < right)
{
base = data[left];
while(i != j)
{
while(j > i && data[j] > base)
j--;
data[i] = data[j];
while(i < j && data[i] < base)
i++;
data[j] = data[i];
}
data[i] = base;
QuickSort(data,left,i-1);
QuickSort(data,i+1,right);
}
}
/*希尔排序。在直接插入排序的基础上增加了一个增量。*/
void ShellSort(int data[],int length)
{
int i;
int j;
int temp;
int gap = length/2;
while(gap > 0)
{
for(i = gap;i < length;i++)
{
temp = data[i];
j = i - gap;
while(j>=0 && data[j] > temp)
{
data[j+gap] = data[j];//数据往后移动一位
j -= gap;
}
data[j+gap] = temp;
}
gap /= 2;
}
}
/*归并排序*/
void Merge(int data[],int low,int mid,int high)
{
int *temp;
int i = low;
int j = mid + 1;
int k = 0;
temp = (int *)malloc((high-low+1)*sizeof(int));
while(i <= mid && j <= high)
{
if(data[i] <= data[j])
{
temp[k] = data[i];
i++;
k++;
}
else
{
temp[k] = data[j];
j++;
k++;
}
}
while(i <= mid)
{
temp[k] = data[i];
i++;
k++;
}
while(j <= high)
{
temp[k] = data[j];
j++;
k++;
}
for(k = 0,i = low;i <= high;k++,i++)
{
data[i] = temp[k];
}
}
void MergeSort(int data[],int low,int high)
{
int mid;
if(low < high)
{
mid = (low + high)/2;
MergeSort(data,low,mid);
MergeSort(data,mid+1,high);
Merge(data,low,mid,high);
}
}
int main(void)
{
initData();
printData("Initial Data:");
MergeSort(data,0,ARRAYSIZE-1);
printData("Afert Sort:");
return 0;
}