目录
一、插入排序
1、直接插入排序
void insertSort(int *A, int n)
{
int i,j;
for (i=2;i<=n;i++) {
if(A[i]<A[i-1]){
A[0]=A[i];
for (j=i-1;A[0]<A[j];j--) {
A[j+1]=A[j];
}
A[j+1]=A[0];
}
}
}
2.折半插入排序
void inserSortByHalf(int *A, int n)
{
int i,j,low,mid,high;
for (i=2;i<=n;i++) {
A[0]=A[i];
low=1;
high=i-1;
while (low<=high) {
mid=(low+high)/2;
if(A[mid]>A[0])
high=mid-1;
else
low = mid+1;
}
for (j=i-1;j>=high+1;j--) {
A[j+1]=A[j];
}
A[high+1]=A[0];
}
}
3.希尔排序
void shellSort(int *A, int n) //类似直接插入
{
int i,j;
for (int dk=n/2;dk>=1;dk/=2) {
for (i=dk+1;i<=n;i++) {
if(A[i]<A[i-dk]){
A[0]=A[i];
for (j=i-dk;j>0 && A[0]<A[j];j-=dk)
A[j+dk]=A[j];
A[j+dk]=A[0];
}
}
}
}
二、交换排序
1.冒泡排序
void BubbleSort(int *A, int n)
{
for (int i=0;i<n-1;i++) {
bool isBubble=false;
for (int j=0;j<n-i-1;j++) {
if(A[j-1]>A[j]){
swap(A[j],A[j-1]);
isBubble=true;
}
}
if(!isBubble)
return;
}
}
2.快速排序
int Partition(int *A, int low, int high)
{
int pivot = A[low];
while (low<high) {
while (low<high && A[high]>=pivot)
high--;
A[low]=A[high];
while (low<high&&A[low]<=pivot)
low++;
A[high]=A[low];
}
A[low]=pivot;
return low;
}
void QuickSort(int *A, int low, int high)
{
if(low<high){
int pivotpos = Partition(A,low,high);
QuickSort(A,low,pivotpos-1);
QuickSort(A,pivotpos+1,high);
}
}
三、选择排序
1.简单选择排序
void selectSort(int *A, int n)
{
for (int i=0;i<n-1;i++) {
int min=i;
for (int j=i+1;j<n;j++) {
if(A[j]<A[min])
min=j;
}
if(min!=i)
swap(A[i],A[min]);
}
}
2.堆排序
void HeadAdjust(int *A, int k, int len)
{
A[0]=A[k];
for (int i=2*k;i<=len;i*=2) {
if(A[i]<A[i+1] && i<len) //A[i]>A[i+1]
i++;
if(A[0]>=A[i]) //A[0]<=A[i] 就是从大到小
break;
else{
A[k]=A[i];
k=i;//再对i做调整
}
}
A[k]=A[0];
}
void buildMaxHeap(int *A, int len)
{
for (int i=len/2;i>0;i--) {
HeadAdjust(A,i,len);
}
}
void heapSort(int *A, int len)
{
buildMaxHeap(A,len);
for (int i=len;i>1;i--) {
swap(A[i],A[1]);
HeadAdjust(A,1,i-1);
}
}
四、二路归并排序
void merge(int *A, int low, int mid, int high)
{
int i,j,k;
for ( k=low;k<=high;k++)
B[k]=A[k];
for ( i=low,j=mid+1,k=i;i<=mid&&j<=high;k++) {
if(B[i]<=B[j])
A[k]=B[i++];
else {
A[k]=B[j++];
}
}
while (i<=mid)
A[k++]=B[i++];
while (j<=high)
A[k++]=B[j++];
}
void mergeSort(int *A, int low, int high)
{
if(low<high){
int mid=(low+high)/2;
mergeSort(A,low,mid);
mergeSort(A,mid+1,high);
merge(A,low,mid,high);
}
}