排序算法实现
来源:互联网 发布:苹果恢复相册照片软件 编辑:程序博客网 时间:2024/06/15 01:12
#include <iostream>#include <stdio.h>using namespace std;#define MAX 6#define MAXLEN 100 //哨兵 // 3 9 6 1 7 4int a[MAX];int b[MAX];//0: print the arrayvoid printArray( ){ //打印数组 for ( int i = 0; i< MAX; i++ ) { cout << b[i] << ends; } cout << endl;}//1. 冒泡排序void BubbleSortArray ( ){ for( int i = 1;i < MAX; i++ ) { int flag = false;//交换标志 for( int j = 0; j < MAX - i; j++ ) { if( b[j] > b[j+1] )//比较交换相邻元素 { int temp; temp = b[j]; b[j] = b[j+1]; b[j+1] = temp; flag = true; } } if( !flag ) break; } //打印结果 cout << "冒泡排序后:" << endl; printArray( );}//2. 选择排序void SelectSortArray() { int min_index; for( int i = 0; i< MAX-1; i++ ) { min_index = i; for( int j = i+1; j < MAX; j++ )//每次扫描选择最小项 if( b[j] < b[min_index]) min_index=j; if( min_index != i )//找到最小项交换,即将这一项移到列表中的正确位置 { int temp; temp = b[i]; b[i]= b[min_index]; b[min_index] = temp; } } //打印结果 cout << "选择排序后:" << endl; printArray( );} // 3. 插入排序void InsertSortArray() { int n = MAX; //循环从第二个数组元素开始,因为arr[0]作为最初已排序部分 i,j分别为有序区和无序区指针 for( int i = 1; i < n; i++ ) { int temp = b[i];//temp标记为未排序第一个元素 int j = i-1; while ( j >= 0 && b[j] > temp )/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/ { b[j+1] = b[j]; j--; } b[j+1] = temp; } //打印结果 cout << "插入排序后:" << endl; printArray( );} //4. 快速排序int partition( int p, int r ){ int x = b[r]; int i = p-1; for( int j = p;j < r; j++ ){ if( b[j] < x ){ i++; int temp = b[i];b[i] = b[j];b[j] = temp; } } int temp1 = b[i+1];b[i+1] = b[r];b[r] = temp1; return i+1; } void quick_sort( int p, int r ){ if(p<r){ int q=partition( p, r ); quick_sort( p, q-1 ); quick_sort( q+1, r ); } } // 5.堆排序template<class T> void Sift( T* heap, int start, int end ) //start和end标示无序区 { T temp = heap[start]; //记录 int parent = start; int child = 2*start + 1; while ( child <= end ) { if( child < end && heap[child] < heap[child+1] ){child++; } if( heap[child] > temp ) { heap[parent] = heap[child]; parent = child; child = 2*child + 1; continue; } else break; } heap[parent] = temp; } template <class T> void MakeHeap( T* heap, int Size ) { int end; //由于所有树叶无需进行下滤(没有孩子), 所以只对0 - size/2的结点进行下滤即可 for( int start = Size/2-1; start>=0; start-- ) { Sift( heap, start, Size-1 ); }} template <class T> void HeapSort( T* heap ) { int Size = MAX; MakeHeap( heap, Size ); T temp; for (int i = Size-1;i >= 0;i--) { temp = heap[i]; heap[i] = heap[0]; heap[0] = temp; Sift(heap,0,i-1); } // print sortResult for ( int i = 0; i < Size; i++ ) { cout << heap[i] << ends; } cout << endl;} /*6. 合并排序:merge sort a.分解Divide:将n个元素分成各含n/2个元素的子序列 b.解决Conquer:递归 用合并排序法对2个子序列递归的排序 c.合并Combine:合并2个已排序的子序列以得到排序结果*/ void merge( int p, int q, int r ) { int n1 = q-p+1; int n2 = r-q; int L[MAX],R[MAX]; for( int i = 0; i < n1; i++ ) L[i] = b[p+i]; for( int i = 0; i < n2; i++ ) R[i] = b[q+i+1]; L[n1] = MAXLEN; R[n2] = MAXLEN; int i = 0; int j = 0; for( int k = p; k <= r; k++ ) { if( L[i] <= R[j] ) { b[k] = L[i]; i++; } else { b[k] = R[j]; j++; } } } void merge_sort( int p, int r ){ if( p < r ) { int q = ( p + r)/2; merge_sort( p, q ); merge_sort( q+1, r ); merge( p, q, r ); }}//7. 希尔排序/*********************************************************函数名称:ShellInsert*参数说明:b 无序数组;* d 增量大小* MAX为无序数据个数*说明: 希尔按增量d的插入排序*********************************************************/void ShellInsert( int d ){for ( int i = d; i < MAX; i += 1 ) //从第2个数据开始插入{int j = i - d;int temp = b[i]; //记录要插入的数据while ( j >= 0 && b[j] > temp ) //从后向前,找到比其小的数的位置{b[j+d] = b[j]; //向后挪动j -= d;}if ( j != i - d ) //存在比其小的数b[j+d] = temp;}}/*********************************************************函数名称:ShellSort*参数说明:b 无序数组;* MAX为无序数据个数*说明: 希尔排序*********************************************************/void ShellSort( ){int d = MAX / 2; //初始增量设为数组长度的一半while( d >= 1 ){ShellInsert( d );d = d / 2; //每次增量变为上次的二分之一}}/******************************************************** *函数名称:GetNumInPos *参数说明:num 一个整形数据 * pos 表示要获得的整形的第pos位数据 *说明: 找到num的从低到高的第pos位的数据 *********************************************************/ int GetNumInPos( int num,int pos ) { int temp = 1; for (int i = 0; i < pos - 1; i++) temp *= 10; return (num / temp) % 10; } /******************************************************** *函数名称:RadixSort *参数说明:b 无序数组; * MAX为无序数据个数 *说明: 基数排序 *********************************************************/ #define RADIX_10 10 //整形排序 #define KEYNUM_31 10 //关键字个数,这里为整形位数 void RadixSort() { int *radixArrays[RADIX_10]; //分别为0~9的序列空间 for (int i = 0; i < 10; i++) { radixArrays[i] = (int *)malloc(sizeof(int) * ( MAX + 1 )); radixArrays[i][0] = 0; //index为0处记录这组数据的个数 } for (int pos = 1; pos <= KEYNUM_31; pos++) //从个位开始到31位 { for (int i = 0; i < MAX; i++) //分配过程 { int num = GetNumInPos(b[i], pos); int index = ++radixArrays[num][0]; radixArrays[num][index] = b[i]; } for (int i = 0, j =0; i < RADIX_10; i++) //收集 { for (int k = 1; k <= radixArrays[i][0]; k++) b[j++] = radixArrays[i][k]; radixArrays[i][0] = 0; //复位 } } //打印结果 cout << "基数排序后:" << endl; printArray( );} int main(){ cout << "input Array a, size= " << ends << MAX <<endl; for( int i = 0; i < MAX; i++) { scanf( "%d", &a[i]); } while(1) { cout << " Please choose action ( digital: 0~8 ) " << endl; cout << " \t\t 0: 程序结束" << endl;cout << " \t\t 1: 冒泡排序" << endl; cout << " \t\t 2: 选择排序" << endl;cout << " \t\t 3: 插入排序" << endl;cout << " \t\t 4: 快速排序" << endl;cout << " \t\t 5: 堆排序" << endl;cout << " \t\t 6: 合并排序" << endl;cout << " \t\t 7: 希尔排序" << endl;cout << " \t\t 8: 基数排序" << endl; int t; cin >> t;if ( t == 0 ){cout << "action ends! " << endl; break;}//每个操作是针对数组b进行排序的,保证每次输入都是首次的无序数组for ( int i = 0; i < MAX; i++ ){b[i] = a[i];} switch ( t ) { case 1: BubbleSortArray(); break; //冒泡排序 case 2: SelectSortArray(); break; //选择排序 case 3: InsertSortArray(); break; //插入排序 case 4: //快速排序 { quick_sort( 0, MAX-1 ); //打印结果 cout << "快速排序后:" << endl; printArray( ); break; } case 5: HeapSort<int>( b ); break; //插入排序 case 6: //合并排序 { merge_sort( 0, MAX-1 ); //打印结果 cout << "合并排序后:" << endl; printArray( ); break; } case 7: //希尔排序 { ShellSort( ); //打印结果 cout << "希尔排序后:" << endl; printArray( ); break; } case 8: RadixSort(); break; default: break; } } return 0;}参考: http://blog.csdn.net/cjf_iceking/article/details/7943609
0 0
- 【排序】内部排序算法实现
- 快速排序算法实现
- 排序算法的实现
- 实现选择排序算法
- 排序算法java实现
- 快速排序算法实现
- 排序算法的实现
- 合并排序 算法实现
- 快速排序算法实现
- 排序算法实现大全
- 基本排序算法实现
- 排序算法JS实现
- 排序算法python实现
- 各排序算法实现
- 堆排序算法实现
- 交换排序算法实现
- 排序算法实现
- 全排序算法实现
- Android学习笔记17——TCP/IP socket编程
- Codeforces Round #250 (Div. 2) -C. The Child and Toy
- 杭电acm1056 hdu-acm-1056解题报告
- HDU1143 - Tri Tiling(插头DP)
- hdoj.2052 Picture 20140804
- 排序算法实现
- Java提高篇(三五)-----Java集合细节(一):请为集合指定初始容量
- HDU 1251 统计难题 Trie题解
- hadoop分布式部署系列1:HDFS
- 编译opengl问题
- java中的序列化问题
- 【POJ 2152】Fire【树形DP】
- Cocos2d-x 3.2 Lua示例 CaptureScreen(截屏)
- 【备忘】Debian打开wireshark出现Gtk-WARNING **: cannot open display: :0解决方案