您的位置:首页 > 编程语言 > C语言/C++

插入排序,快速排序,堆排序,归并排序

2013-11-19 16:19 288 查看
插入排序

void insert_sort(int arry[], int length)
{
if(length < 2)
return;

for(int i = 1; i != length; ++i)
if(arry[i-1] > arry[i]){
int temp = arry[i], j;
for(j = i-1; j >= 0 && arry[j] > temp; --j)
arry[j+1] = arry[j];
arry[j+1] = temp;
}
}


快速排序

int quick_adj(int arry[], int low, int high)
{
//将第一个,最后一个和中间一个元素中居中的元素选为枢轴
if((arry[low] >= arry[(high+low)/2] && arry[low] <= arry[high]) ||
(arry[low] >= arry[high] && arry[low] <= arry[(high+low)/2])){
int temp = arry[low];
arry[low] = arry[high];
arry[high] = temp;
}else if((arry[(high+low)/2] >= arry[low] && arry[(high+low)/2] <= arry[high]) ||
(arry[(high+low)/2] >= arry[high] && arry[(high+low)/2] <= arry[low])){
int temp = arry[(high+low)/2];
arry[(high+low)/2] = arry[high];
arry[high] = temp;
}
int pivot = arry[high];

while(low < high){
while(arry[low] <= pivot && low < high)
++low;
arry[high] = arry[low];
while(arry[high] >= pivot && low < high)
--high;
arry[low] = arry[high];
}
arry[low] = pivot;
return low;
}

void quick_sort(int arry[], int low, int high)
{
if(low < high){
int pivot = quick_adj(arry, low, high);
quick_sort(arry, low, pivot-1);
quick_sort(arry, pivot+1, high);
}
}


堆排序

void heap_adj(int arry[], int low, int high)
{
//大顶堆
int temp = arry[low];
for(int i = 2*low+1; i <= high; i = 2*i+1){
if(i < high && arry[i] < arry[i+1])
++i;
if(arry[i] <= temp)
break;
arry[low] = arry[i];
low = i;
}
arry[low] = temp;
}

void heap_sort(int arry[], int length)
{
for(int i = (length-1)/2; i >= 0; --i)
heap_adj(arry, i, length-1);
for(int i = length-1; i > 0; --i){
int temp = arry[0];
arry[0] = arry[i];
arry[i] = temp;
heap_adj(arry, 0, i-1);
}
}


归并排序

void merge(int arry[], int* temp, int low, int mid, int high)
{
int i, j, k;
for(i = low, j = mid+1, k = low; i <= mid && j <= high; ++k){
if(arry[i] < arry[j])
temp[k] = arry[i++];
else
temp[k] = arry[j++];
}
while(i <= mid)
temp[k++] = arry[i++];
while(j <= high)
temp[k++] = arry[j++];
while(--k >= low)
arry[k] = temp[k];
}

void m_sort(int arry[], int* temp, int low, int high)
{
if(low < high){
int mid = (low+high)/2;
m_sort(arry, temp, low, mid);
m_sort(arry, temp, mid+1, high);
merge(arry, temp, low, mid, high);
}
}

void merge_sort(int arry[], int low, int high)
{
int* p = new int[high-low+1];
m_sort(arry, p, low, high);
delete[] p;
}


使用c标准库提供的rand()函数随机产生20万个[0,100]的整数,大致的排序时间为:插入排序43.47秒;快速排序0.67秒;堆排序0.05秒;归并排序0.05秒.另外直接调用C++algorithm的sort排序,耗时大致为0.04秒,标准库就是牛啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 排序
相关文章推荐