排序算法分析

#include<iostream>
#include<cassert>
#include <algorithm>
using namespace std;
void insertion_sort(int a[], int n)//insertion sort
{
assert(a != NULL );
int temp;
int j = 0;
for (int p = 1; p < n; ++p)
{
temp = a[ p];
for ( j = p; j > 0 && a[j - 1 ]>temp; --j)
{
a [j] = a[j - 1 ];
}
a [j] = temp;
}
}
// bubble sort 的改进版，一旦没发生交换则排序结束， flag去掉则为原始版本。
void bubble_sort(int a[], int n)
{
assert(a != NULL );
int i, j ,flag= 1;
for (i = 0 ; i < n - 1 && flag; ++i)
{
flag = 0 ;
for ( j = 0; j < n - 1 - i;++j )
if ( a[j]>a [j + 1 ])
{
swap (a[ j], a[j + 1 ]);
flag = 1 ;
}
}
}
void selection_sort(int a[], int n)//selection sort
{
assert(a != NULL );
int i, j , min;
for (i = 0 ; i < n; ++i )
{
min = i;
for ( j = i + 1; j < n;++ j)
if ( a[j] < a[ min])
min = j;
if(min != i)
swap (a[ min], a [i]);
}
}
int partition(int a[], int start, int end) //partition 算法
{
assert(a != NULL );
int middle = ( start + end ) / 2 ;
int pivotIndex ;
if (a[ start] < a[ middle])
if ( a[middle] < a[ end])
pivotIndex = middle;
else if (a[start ] < a[end])
pivotIndex = end;
else
pivotIndex = start;
else if ( a[start] <a[ end])
pivotIndex = start;
else if ( a[middle]<a [end])
pivotIndex = end;
else
pivotIndex = middle;
int pivot = a[ pivotIndex];
swap(a [pivotIndex], a[end ]);
int storeIndex = start;
for (int i = start ; i < end; ++i)
{
if ( a[i]<pivot )
{
swap (a[ i], a[storeIndex ]);
++storeIndex;
}
}
swap(a [storeIndex], a[end ]);
cout << pivot << endl;
return storeIndex ;
}
void quick_sort(int a[], int left, int right) //quick sort
{
if (left == right)
return;
int index = partition(a, left , right);
if (index > left)
quick_sort (a, left, index - 1 );
if (index < right)
quick_sort (a, index+1 , right);
}
//归并排序的merge相当于两个已排序链表或者数组的合并
void merge( int arr[], int temp_arr[], int start_index, int mid_index , int end_index)
{
int i = start_index , j = mid_index + 1;
int k = 0;
while (i < mid_index + 1 && j < end_index + 1)
temp_arr [k++] = arr[i ] > arr[j ] ? arr[j ++] : arr[i ++];
while (i < mid_index+1 )
temp_arr [k++] = arr[i ++];
while (j < end_index+1 )
temp_arr [k++] = arr[j ++];
for (i = 0 , j = start_index; j < end_index+1; i ++, j++)
arr [j] = temp_arr[i ];
}
void merge_sort(int a[], int temp_a[], int start_index, int end_index )
{
if (start_index == end_index)
return;
int mid_index = ( start_index + end_index ) / 2 ;
merge_sort(a , temp_a, start_index, mid_index );
merge_sort(a , temp_a, mid_index + 1, end_index );
merge(a , temp_a, start_index, mid_index , end_index);
}
void heap_adjust(int a[], int i, int len)//heap sort
{
int child ;
int temp;
for (; 2 * i + 1 < len; i = child )
{
child = 2 * i + 1;
if(child <len - 1 && a[child + 1 ] > a[child])
++child;
if ( a[i] < a[ child])
{
temp = a[ i];
a [i] = a[child ];
a [child] = temp;
}
else
break;
}
}
void heap_sort(int a[], int len)
{
assert(a != NULL );
int i;
for ( i = len / 2; i >= 0 ; -- i)
for (i = len - 1; i > 0 ; -- i)
{
int tmp = a[0];
a [0] = a[i ];
a [i] = tmp;
}
}
//shell sort，中间两个循环的思想和插入排序一样，每次相当于对 incur个子数组进行排序
void shell_sort(int a[], int len)
{
int i, j , incr;
int temp;
for (incr = len / 2; incr > 0 ; incr /= 2 )
{
for ( i = incr; i < len; i++)
{
temp = a[ i];
for ( j = i; j >= incr && a[j - incr ]>temp; j -= incr )
a [j] = a[j - incr];
a [j] = temp;
}
}
}
int main() {
int arr[] = { 61 , 17 , 29 , 22 , 34 , 60 , 72 , 21 , 50 , 1 , 62 };
int len = (int) sizeof(arr) / sizeof(*arr);
cout << len << endl;
int *temp_a = new int [len];
merge_sort(arr ,temp_a, 0,len -1);
delete[]temp_a;
for (int i = 0; i < len; i++)
cout << arr[ i] << ' ';
cout << endl ;
return 0;
}

• 本文已收录于以下专栏：

几种排序算法实现分析

• qbg19881206
• 2013年06月30日 23:09
• 618

排序算法实现及分析

• wuzhekai1985
• 2011年07月15日 11:00
• 1938

7种排序算法实现及分析

• u013239665
• 2014年10月07日 07:23
• 343

排序算法实现以及比较

• zhangph1229
• 2016年07月31日 19:33
• 1023

各种排序算法--c++实现

#include using namespace std; //堆排序 void FindMaxInHeap(int arr[], int size) { for (int j = ...
• woailvmengmeng
• 2014年04月10日 15:26
• 968

各类排序算法的对比及实现

（直接插入排序，希尔，选择排序，堆排序，冒泡排序，快排，归并）各类排序的算法比较及实现...
• wangiijing
• 2016年05月23日 23:29
• 2415

数据结构复习：几种排序算法的C++实现和二叉树的相关算法实现

用c语言实现了二叉树的数据定义，二叉树的构建、销毁，以及先序、中序、后序的递归算法，非递归算法正在研究中。/*---------------------------------------...
• yysdsyl
• 2007年11月14日 21:58
• 3478

【算法C++】烙饼排序

• zgljl2012
• 2015年09月28日 23:36
• 1880

排序算法实现

• coolibin
• 2013年10月24日 10:56
• 728

数据结构——排序查找算法实现

• u010757264
• 2016年08月18日 16:13
• 471

举报原因： 您举报文章：排序算法实现分析 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)