快速排序、插入排序、归并排序
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
//插入排序
void inertsort(int *a,int n)
{
int i,j,temp;
for(i =1;i < n;i++)
{
j = i;
while(j > 0&& a[j] < a[j-1]) //插入的值需要与原先序列中的值依次比较大小
{
temp = a[j];
a[j] = a[j-1];
a[j-1] = temp;
j--;
}
}
}
//快速排序
void quicksort(int *a,int low, int high)
{
int key = a[low];
int i = low;
int j = high;
while(i < j)
{
if(i < j)
{
while(i < j&&a[j] >= key) //从后往前寻找第一个小于key的值
{
j--;
}
if(i < j)
{
a[i] = a[j];
i += 1;
while(i<j&&a[i]<= key) //从前往后寻找第一个大于Key的值
{
i++;
}
if(i <j)
{
a[j] = a[i];
j--;
}
}
}
}
a[i] = key;
if(low < i-1) quicksort(a,low,i-1);
if(j+1< high) quicksort(a,j+1,high);
}
//归并排序
void merge(int *a, int low,int mid,int high,int *c) //将a[low:mid]数组和a[mid+1,high]数组合并到数组c中
{
int k = 0;
int idxa = low,idxb = mid +1;
while(idxa <= mid && idxb <= high)
{
if(a[idxa] <= a[idxb])
{
c[k++] = a[idxa++];
}
else
{
c[k++] = a[idxb++];
}
}
while(idxa <= mid) //如果a[low:mid]数组有剩余,则说明剩余的值都比a[mid+1,high]大
{
c[k++] = a[idxa++];
}
while(idxb <= high) //同上
{
c[k++] = a[idxb++];
}
for(int i =0; i < k; i++) //最后将值赋给数组a,由于每次low的起始位置不定,不始终为0
{
a[low+i] = c[i];
}
}
void mergesort(int *a,int low,int high, int *c)//依次递归直到只有一个元素,此时有序
{
int mid = 0;
if(low < high)
{
mid = (low + high)/2;
mergesort(a,low,mid,c);
mergesort(a,mid+1,high,c);
merge(a,low,mid,high,c);
}
}
int main(void)
{
int a[7] = {1,3,5,7,9,0,8};
int c[10] ={0} ;
mergesort(a,0,6,c);
for(int i=0;i<7;i++)
{
cout<<a[i];
}
return 0;
}
其中插入排序和快速排序均属于内排序,而归并排序则是外排序,由于归并排序使用了外部内存,用空间换取了时间,所以归并排序的时间复杂度最坏和最好都为O(N*logN),快速排序最好为O(N*logN),最坏为O(N^2);
浙公网安备 33010602011771号