菜鸟教程:十大经典排序算法
插入排序
直接插入排序
算法:
void InsertSort(int a[],int n)
{
for(int i=2;i<=n;i++)
{
int j;
a[0]=a[i];
for(j=i-1;a[0]<a[j];j--) a[j+1]=a[j];
a[j+1]=a[0];
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ARRAY_LENGTH 12
void InsertSort(int a[],int n)
{
for(int i=2;i<=n;i++)
{
int j;
a[0]=a[i];
for(j=i-1;a[0]<a[j];j--) a[j+1]=a[j];
a[j+1]=a[0];
}
}
int main()
{
int array[ARRAY_LENGTH+1]={-1,8,14,12,19,15,23,20,46,25,74,86,35};
cout<<"原序列:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl;
InsertSort(array,ARRAY_LENGTH);
cout<<"直接插入排序:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl;
system("pause");
return 0;
}
折半插入排序
算法:
void BinSort(int a[],int n)
{
for(int i=2;i<=n;i++)
{
a[0]=a[i];
int low=1;
int high=i-1;
while(low<=high)
{
int mid=(low+high)/2;
if(a[0]<a[mid]) high=mid-1;
else low=mid+1;
}
//high+1即为插入位置
for(int j=i-1;j>=high+1;j--) a[j+1]=a[j];
a[high+1]=a[0];
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ARRAY_LENGTH 12
void BinSort(int a[],int n)
{
for(int i=2;i<=n;i++)
{
a[0]=a[i];
int low=1;
int high=i-1;
while(low<=high)
{
int mid=(low+high)/2;
if(a[0]<a[mid]) high=mid-1;
else low=mid+1;
}
//high+1即为插入位置
for(int j=i-1;j>=high+1;j--) a[j+1]=a[j];
a[high+1]=a[0];
}
}
int main()
{
int array[ARRAY_LENGTH+1]={-1,8,14,12,19,15,23,20,46,25,74,86,35};
cout<<"原序列:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl;
BinSort(array,ARRAY_LENGTH);
cout<<"折半插入排序:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl;
system("pause");
return 0;
}
希尔排序
算法:
void ShellSort(int a[],int n,int d[],int t)
{
for(int k=0;k<t;k++)
{
int dk=d[k];
for(int m=1;m<=n;m++)
{
for(int i=m+dk;i<=n;i+=dk)
{
int j;
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];
}
}
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ARRAY_LENGTH 12
#define D_LENGTH 3
void ShellSort(int a[],int n,int d[],int t)
{
for(int k=0;k<t;k++)
{
int dk=d[k];
for(int m=1;m<=n;m++)
{
for(int i=m+dk;i<=n;i+=dk)
{
int j;
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];
}
}
cout<<"增量d="<<dk<<endl;
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<a[i]<<" ";
cout<<endl;
}
}
int main()
{
int array[ARRAY_LENGTH+1]={-1,23,15,12,35,46,19,20,14,8,74,86,25};
int d[D_LENGTH]={5,3,1};
cout<<"原序列:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl<<endl;
ShellSort(array,ARRAY_LENGTH,d,D_LENGTH);
system("pause");
return 0;
}
冒泡排序
算法:
void BubbleSort(int a[],int n)
{
int change=1;
for(int i=1;i<=n-1 && change;i++)
{
change=0;
for(int j=1;j<=n-i;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
change=1;
}
}
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ARRAY_LENGTH 12
void BubbleSort(int a[],int n)
{
int change=1;
for(int i=1;i<=n-1 && change;i++)
{
change=0;
for(int j=1;j<=n-i;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
change=1;
}
}
cout<<"第"<<i<<"趟冒泡排序:";
for(int k=1;k<=ARRAY_LENGTH;k++) cout<<a[k]<<" ";
cout<<endl;
}
}
int main()
{
int array[ARRAY_LENGTH+1]={-1,23,15,12,35,46,19,20,14,8,74,86,25};
cout<<"原序列:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl<<endl;
BubbleSort(array,ARRAY_LENGTH);
cout<<endl<<"最终结果:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl;
system("pause");
return 0;
}
冒泡排序的改进
算法:
void BubbleModifiedSort(int a[],int n)
{
int i=n;
while(i>1)
{
int LastExchangeIndex=1;
for(int j=1;j<i;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
LastExchangeIndex=j;
}
}
i=LastExchangeIndex;
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ARRAY_LENGTH 12
void BubbleModifiedSort(int a[],int n)
{
int i=n;
int count=0;
while(i>1)
{
int LastExchangeIndex=1;
for(int j=1;j<i;j++)
{
if(a[j]>a[j+1])
{
int temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
LastExchangeIndex=j;
}
}
i=LastExchangeIndex;
cout<<"第"<<++count<<"趟改进后的冒泡排序:";
for(int k=1;k<=ARRAY_LENGTH;k++) cout<<a[k]<<" ";
cout<<endl;
}
}
int main()
{
int array[ARRAY_LENGTH+1]={-1,23,15,12,35,46,19,20,14,8,74,86,25};
cout<<"原序列:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl<<endl;
BubbleModifiedSort(array,ARRAY_LENGTH);
cout<<endl<<"最终结果:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl;
system("pause");
return 0;
}
快速排序
算法:
int QuickPass(int a[],int left,int right)
{
int i=left;
int j=right;
a[0]=a[left];
while(i<j)
{
while(i<j && a[j]>=a[0]) j--;
if(i<j)
{
a[i]=a[j];
i++;
}
while(i<j && a[i]<a[0]) i++;
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=a[0];
return i;
}
void QuickSort(int a[],int low,int high)
{
if(low<high)
{
int pos=QuickPass(a,low,high);
QuickSort(a,low,pos-1);
QuickSort(a,pos+1,high);
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ARRAY_LENGTH 12
int count=0;
int QuickPass(int a[],int left,int right)
{
int i=left;
int j=right;
int x=a[left];
while(i<j)
{
while(i<j && a[j]>=x) j--;
if(i<j)
{
a[i]=a[j];
i++;
}
while(i<j && a[i]<x) i++;
if(i<j)
{
a[j]=a[i];
j--;
}
}
a[i]=x;
cout<<"第"<<++count<<"趟快速排序:";
for(int k=1;k<=ARRAY_LENGTH;k++) cout<<a[k]<<" ";
cout<<endl;
return i;
}
void QuickSort(int a[],int low,int high)
{
if(low<high)
{
int pos=QuickPass(a,low,high);
QuickSort(a,low,pos-1);
QuickSort(a,pos+1,high);
}
}
int main()
{
int array[ARRAY_LENGTH+1]={-1,23,15,12,35,46,19,20,14,8,74,86,25};
cout<<"原序列:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl<<endl;
QuickSort(array,1,ARRAY_LENGTH);
cout<<endl<<"最终结果:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl;
system("pause");
return 0;
}
简单选择排序
算法:
void SelectSort(int a[],int n)
{
for(int i=1;i<=n-1;i++)
{
int k=i;
for(int j=i+1;j<=n;j++)
{
if(a[j]<a[k]) k=j;
}
if(k!=i)
{
int temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ARRAY_LENGTH 12
void SelectSort(int a[],int n)
{
for(int i=1;i<=n-1;i++)
{
int k=i;
for(int j=i+1;j<=n;j++)
{
if(a[j]<a[k]) k=j;
}
if(k!=i)
{
int temp=a[i];
a[i]=a[k];
a[k]=temp;
}
cout<<"第"<<i<<"趟简单选择排序:";
for(int k=1;k<=ARRAY_LENGTH;k++) cout<<a[k]<<" ";
cout<<endl;
}
}
int main()
{
int array[ARRAY_LENGTH+1]={-1,23,15,12,35,46,19,20,14,8,74,86,25};
cout<<"原序列:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl<<endl;
SelectSort(array,ARRAY_LENGTH);
cout<<endl<<"最终结果:";
for(int i=1;i<=ARRAY_LENGTH;i++) cout<<array[i]<<" ";
cout<<endl;
system("pause");
return 0;
}
堆排序
算法:
void max_heapify(int a[], int start, int end)
{
int dad = start;
int son = dad * 2 + 1;
while (son <= end)
{
if (son + 1 <= end && a[son] < a[son + 1])
son++;
if (a[dad] > a[son])
return;
else
{
swap(a[dad], a[son]);
dad = son;
son = dad * 2 + 1;
}
}
}
void HeapSort(int a[], int len)
{
for (int i = len / 2 - 1; i >= 0; i--)
max_heapify(a, i, len - 1);
for (int i = len - 1; i > 0; i--)
{
swap(a[0], a[i]);
max_heapify(a, 0, i - 1);
}
}
完整代码:
在这里插入代码片
二路归并排序
算法:
//合并过程中 p<=q<r
void Merge(int array[], int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int *L;
L = (int *)malloc(sizeof(int) * n1);
int *R;
R = (int *)malloc(sizeof(int) * n2);
int i = 0;
int j = 0;
for (i; i < n1; i++)
L[i] = array[i + p];
for (j; j < n2; j++)
R[j] = array[j + q + 1];
i = j = 0;
int k = p;
while (i != n1 && j != n2)
{
if (L[i] <= R[j])
array[k++] = L[i++];
else
array[k++] = R[j++];
}
while (i < n1)
array[k++] = L[i++];
while (j < n2)
array[k++] = R[j++];
free(L);
free(R);
}
void MergeSort(int array[], int p, int q)
{
if (p < q)
{
int r = (p + q) / 2;
MergeSort(array, p, r);
MergeSort(array, r + 1, q);
Merge(array, p, r, q);
}
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ARRAY_LENGTH 12
//合并过程中 p<=q<r
void Merge(int array[], int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int *L;
L = (int *)malloc(sizeof(int) * n1);
int *R;
R = (int *)malloc(sizeof(int) * n2);
int i = 0;
int j = 0;
for (i; i < n1; i++)
L[i] = array[i + p];
for (j; j < n2; j++)
R[j] = array[j + q + 1];
i = j = 0;
int k = p;
while (i != n1 && j != n2)
{
if (L[i] <= R[j])
array[k++] = L[i++];
else
array[k++] = R[j++];
}
while (i < n1)
array[k++] = L[i++];
while (j < n2)
array[k++] = R[j++];
free(L);
free(R);
}
void MergeSort(int array[], int p, int q)
{
if (p < q)
{
int r = (p + q) / 2;
MergeSort(array, p, r);
MergeSort(array, r + 1, q);
Merge(array, p, r, q);
}
}
int main()
{
int array[ARRAY_LENGTH] = {23, 15, 12, 35, 46, 19, 20, 14, 8, 74, 86, 25};
cout << "原序列:";
for (int i = 0; i < ARRAY_LENGTH; i++)
cout << array[i] << " ";
cout << endl
<< endl;
MergeSort(array, 0, ARRAY_LENGTH - 1);
cout << endl
<< "最终结果:";
for (int i = 0; i < ARRAY_LENGTH; i++)
printf("%d ", array[i]);
cout << endl;
system("pause");
return 0;
}
基数排序
算法:
int maxbit(int a[], int n) //辅助函数,求数据的最大位数
{
int maxData = a[0]; ///< 最大数
/// 先求出最大数,再求其位数,这样有原先依次每个数判断其位数,稍微优化点。
for (int i = 1; i < n; ++i)
{
if (maxData < a[i])
maxData = a[i];
}
int d = 1;
int p = 10;
while (maxData >= p)
{
//p *= 10; // Maybe overflow
maxData /= 10;
++d;
}
return d;
/* int d = 1; //保存最大的位数
int p = 10;
for(int i = 0; i < n; ++i)
{
while(data[i] >= p)
{
p *= 10;
++d;
}
}
return d;*/
}
void RadixSort(int a[], int n) //基数排序
{
int d = maxbit(a, n);
int *tmp = new int[n];
int *count = new int[10]; //计数器
int i, j, k;
int radix = 1;
for (i = 1; i <= d; i++) //进行d次排序
{
for (j = 0; j < 10; j++)
count[j] = 0; //每次分配前清空计数器
for (j = 0; j < n; j++)
{
k = (a[j] / radix) % 10; //统计每个桶中的记录数
count[k]++;
}
for (j = 1; j < 10; j++)
count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶
for (j = n - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中
{
k = (a[j] / radix) % 10;
tmp[count[k] - 1] = a[j];
count[k]--;
}
for (j = 0; j < n; j++) //将临时数组的内容复制到data中
a[j] = tmp[j];
radix = radix * 10;
}
delete[] tmp;
delete[] count;
}
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ARRAY_LENGTH 12
int maxbit(int a[], int n) //辅助函数,求数据的最大位数
{
int maxData = a[0]; ///< 最大数
/// 先求出最大数,再求其位数,这样有原先依次每个数判断其位数,稍微优化点。
for (int i = 1; i < n; ++i)
{
if (maxData < a[i])
maxData = a[i];
}
int d = 1;
int p = 10;
while (maxData >= p)
{
//p *= 10; // Maybe overflow
maxData /= 10;
++d;
}
return d;
/* int d = 1; //保存最大的位数
int p = 10;
for(int i = 0; i < n; ++i)
{
while(data[i] >= p)
{
p *= 10;
++d;
}
}
return d;*/
}
void RadixSort(int a[], int n) //基数排序
{
int d = maxbit(a, n);
int *tmp = new int[n];
int *count = new int[10]; //计数器
int i, j, k;
int radix = 1;
for (i = 1; i <= d; i++) //进行d次排序
{
for (j = 0; j < 10; j++)
count[j] = 0; //每次分配前清空计数器
for (j = 0; j < n; j++)
{
k = (a[j] / radix) % 10; //统计每个桶中的记录数
count[k]++;
}
for (j = 1; j < 10; j++)
count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶
for (j = n - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中
{
k = (a[j] / radix) % 10;
tmp[count[k] - 1] = a[j];
count[k]--;
}
for (j = 0; j < n; j++) //将临时数组的内容复制到data中
a[j] = tmp[j];
radix = radix * 10;
}
delete[] tmp;
delete[] count;
}
int main()
{
int array[ARRAY_LENGTH] = {23, 15, 12, 35, 46, 19, 20, 14, 8, 74, 86, 25};
cout << "原序列:";
for (int i = 0; i < ARRAY_LENGTH; i++)
cout << array[i] << " ";
cout << endl
<< endl;
RadixSort(array, ARRAY_LENGTH);
cout << endl
<< "最终结果:";
for (int i = 0; i < ARRAY_LENGTH; i++)
printf("%d ", array[i]);
cout << endl;
system("pause");
return 0;
}