标签:
进入找工作倒计时状态了,计划好好复习一下数据结构和相关算法,预计用两天时间把见过的排序算法整理下,首先看一下时间复杂度为O(n2)的算法。
首先参考大话数据结构定义一个链表类:
<pre name="code" class="cpp">#include <iostream> #define MAXSIZE 1000 using namespace std; class SqList{ public: SqList():length(0){} SqList(int length1,int value=0):length(length1) { for(int i=0;i<length;++i) { data[i]=value; } } bool insertTail(int value) { if(length>=MAXSIZE) { return false; } data[length]=value; length++; } friend ostream& operator<<(ostream& output, SqList list); public: int data[MAXSIZE]; int length; }; void swap(int& a,int &b) { int tmp=a; a=b; b=tmp; } ostream& operator<<(ostream& output, SqList list) { for (int i = 0; i<list.length; ++i) { output <<list.data[i] << " "; if ((i + 1) % 18 == 0) output << endl; } output << endl; return output; }
冒泡排序法:
/** *冒泡排序即相邻的两者相互比较,根据需求把较大的或较小的前移或后移 *记住,两两相邻的比较是冒泡排序的特点之一 */ void BubbleSort1(SqList* list) {//每次遍历时把较大者后移 int length=list->length; while(length>0) { for(int i=0;i<length-1;++i) { if(list->data[i] > list->data[i+1]) swap(list->data[i],list->data[i+1]); } length--; } } void BubbleSort2(SqList* list) {//每次遍历时,把较小的前移 for(int i=0;i<list->length;i++) { for(int j=list->length-2;j>=i;j--) { if(list->data[j] > list->data[j+1]) swap(list->data[j],list->data[j+1]); } } }
/** *选取排序即每次在未排序队列当中选取一个最小值,然后与第i个值进行交换,直至i为length为止; *当然,也可以选取最大值把到后面,根据需求而定 */ void selectSort(SqList* list) { for (int i = 0; i < list->length; ++i) { int min = list->data[i]; int pos = i; for (int j = i+1; j < list->length; ++j) { if (list->data[j] < min) { min = list->data[j]; pos = j; } } if (pos != i) { swap(list->data[i], list->data[pos]); } } }
<span style="font-size:14px;">/** *遍历链表,把每个元素插入到正确位置 */ void InsertSort1(SqList *list) { for (int i = 1; i < list->length; ++i) { int j = i - 1; for (; j >=0; j--) { if (list->data[i] > list->data[j]) break; } int tmp = list->data[i]; for (int k = i; k > j+1; --k) { list->data[k] = list->data[k - 1]; } list->data[j + 1] = tmp; } } void InsertSort2(SqList *list) { for (int i = 1; i < list->length; ++i) { if (list->data[i] < list->data[i - 1]) { int tmp = list->data[i]; int j = i-1; for (; j >= 0 && list->data[j] > tmp; --j) {//查找的同时,进行后移操作 list->data[j + 1] = list->data[j]; } list->data[j + 1] = tmp; } } }</span>
/** *希尔排序是插入排序的一种改进,可以理解为把一个数组分成几个小的数组进行插入排序,再合并使原数组基本有序。 *希尔排序一个很关键的步骤是增量的选取,合适的增量能够提高排序效率,但不合适的增量可能会导致程序崩溃或结果错误。 *其次,希尔排序也不是一个稳定的排序算法,因为它是跳跃插入排序的。 *希尔排序只是比前面几种O(n2)的效果稍好,并不会优于后面要提到的快速排序等算法。 */ void ShellSort(SqList* list) { int increment = list->length; do{ increment = increment / 3 + 1; for (int i = increment + 1; i < list->length; ++i) { if (list->data[i] < list->data[i - increment]) { int tmp = list->data[i]; int j = i - increment; for (; j >= 0 && list->data[j] > tmp; j -= increment) { list->data[j + increment] = list->data[j]; } list->data[j + increment] = tmp; } } } while (increment > 1); }
标签:
原文地址:http://blog.csdn.net/walker19900515/article/details/46669667