插入排序
void InsertSort(int array[],int n) //n为数组长度
{
for(int i=1;i<n;i++)
{
int key = array[i]; //当前元素的值设为key
while(i>0 && array[i-1]>key) //当前元素之前的值比当前元素大
{
array[i] = array[i-1]; //元素右移
i--; //继续比较
}
array[i] = key; //将当前元素插入合适位置
}
}
选择排序
public void selectSort()
{
for(int i=0;i<size-1;i++)
{
int min = i; //假设此位置的元素是最小的
for(int j=i+1;j<size;j++) //向后面找到最小的元素
{
if(list[j] < list[min])
min = j;
}
int temp = list[i]; //将最小的元素放到此位置
list[i] = list[min];
list[min] = temp;
}
}
冒泡排序
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
归并排序
void Merge(int *a,int p, int q, int r)
{
int n1 = q - p + 1; //左部分的的元素个数
int n2 = r - q; //右部分
int i, j, k;
int *L = new int[n1+1];
int *R = new int[n2+1];
for(i=0;i<n1;i++)
L[i]=a[p+i]; //P+i !!!!!!!
for(j=0;j<n2;j++)
R[j]=a[q+j+1];
L[n1]=MAX;
R[n2]=MAX;
for(i=0,j=0,k=p;k<=r;k++)
{
if(L[i]<=R[j])
a[k]=L[i++];
else
a[k]=R[j++];
}
delete []L;
delete []R;
}
void MergeSort(int array[],int left,int right)
{
if(left<right) //条件是left<right
{
int mid = (left+right)/2;
MergeSort(array,left,mid);
MergeSort(array,mid+1,right);
Merge(array,left,mid,right);
}
}
void MergeSort2(int *a, int p, int r)
{
if ((r-p)>=50) // 小于50个数据的数组进行插入排序
{
int q = (p+r)/2;
MergeSort2(a, p, q);
MergeSort2(a, q+1, r);
Merge(a, p, q, r);
}else
{
InsertionSort(a+p, r-p+1); //a+p为数组首地址,r-p+1为长度
}
}
希尔排序
void shellSort(int[] list,int size)
{
for(int k = size/2;k>0;k/=2) //确定间隔
{
for(int i=k;i<size;i+=k) //类似插入排序
{
int key = list[i];
while(i>0 && list[i-k] > key)
{
list[i] = list[i-k];
i-=k;
}
list[i] = key;
}
}
}
快速排序
int randomized_partition(int a[],int low,int high)
{
int i,j,x;
srand((int)time(NULL)); //<cstdlib> <ctime>
int k = rand()%(high - low + 1) + low; //实现随机选取pivot
swap(a[k],a[high]);
x = a[high];
i = low - 1;
for(j=low;j<high;j++)
{
if(a[j]<=x)
{
i++;
swap(a[i],a[j]);
}
}
swap(a[i+1],a[high]);
return i+1;
}
void QuickSort(int a[],int low,int high)
{
if(low<high)
{
int i = partition(a,low,high);
QuickSort(a,low,i-1);
QuickSort(a,i+1,high);
}
}
堆排序
void Heapify(int a[],int size,int i) //此为堆最大堆的堆化
{
int l = 2*i+1;
int r = 2*i+2;
int largest = i; //假定父节点是最大的
if(l<size && a[l]>a[i])largest = l;
if(r<size && a[r]>a[largest])largest = r;
if(largest != i)
{
swap(a[i],a[largest]);
Heapify(a,size,largest);
}
}
void Build_heap(int a[],int size)
{
for(int i = size/2-1;i>=0;i--)
{
Heapify(a,size,i);
}
}
void Heapsort(int a[],int size)
{
Build_heap(a,size);
for(int i=size-1;i>=1;i--)
{
swap(a[i],a[0]);
Heapify(a,--size,0);
}
}
计数排序
//计数排序
void countingSort(int a[], int n)
{
int maxNum = a[0];
for (int i = 1; i < n; i++)
if (a[i] > maxNum)maxNum = a[i]; //找到最大整数
int c[maxNum + 1];
memset(c, 0, sizeof(c));
for (int i = 0; i < n; i++)
c[a[i]]++; //统计每个元素有几个
for (int i = 1; i <= maxNum; i++)
c[i] += c[i - 1]; //前缀和
int b[n]; //反向填充
for (int i = n - 1; i >= 0; i--)
{
b[--c[a[i]]] = a[i];
//b[c[a[i]] - 1] = a[i];
//--c[i];
}
memcpy(a, b, sizeof(int)*n); //复制回去
}
奇偶排序
void Odd_even_sort(int a[],int size)
{
bool sorted = false;
while(!sorted)
{
sorted = true;
for(int i=0;i<size-1;i+=2)
{
if(a[i]>a[i+1])
{
swap(a[i],a[i+1]);
sorted = false;
}
}
for(int i=1;i<size-1;i+=2)
{
if(a[i]>a[i+1])
{
swap(a[i],a[i+1]);
sorted = false;
}
}
}
}