经典排序算法总结(代码) .(转)

经典排序算法总结(代码)

·冒泡法

·快速排序

·插入排序

·希尔(shell)排序

·选择排序

·堆排序

·归并排序

 

附:

排序算法原理:http://zh.wikipedia.org/wiki/Category:%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95

flash演示:http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/list.asp?id=7

归并排序的具体介绍在下面的文章里:

递归算法学习---归并排序

[cpp] view plaincopyprint?
#include <iostream>   

#include <string>   

using namespace std;  

     /*                冒泡法 

     左右元素相比,往后冒泡 

     */  

template<typename T>  

void BubbleSort(T* r, int n)  

{  

     T temp;  

     int i,j;  

     for (i=0;i<n-1;i++)  

     {  

         for (j=0;j<n-i-1;j++)  

         {  

              if (r[j] > r[j+1])  

              {  

                   temp = r[j];  

                   r[j] = r[j+1];  

                   r[j+1] = temp;  

              }  

         }  

     }  

}  

#include <iostream>

#include <string>

using namespace std;

     /*                冒泡法

     左右元素相比,往后冒泡

     */

template<typename T>

void BubbleSort(T* r, int n)

{

     T temp;

     int i,j;

     for (i=0;i<n-1;i++)

     {

         for (j=0;j<n-i-1;j++)

         {

              if (r[j] > r[j+1])

              {

                   temp = r[j];

                   r[j] = r[j+1];

                   r[j+1] = temp;

              }

         }

     }

}

[cpp] view plaincopyprint?
/*快速排序 

左边比他小,右边比他大,每次得到一个最左边数据的位置*/  

template<typename T>  

void QuickSort(T a[],int low,int high)  

{  

     if(low < high)  

     {  

         T elem = a[low];  

         int l = low, r = high;  

         while(l < r)  

         {    

              while(l < r && a[r] >= elem) r--;  

              if (l < r)  

              {  

                   a[l++] = a[r];  

              }  

              while(l< r && a[l] <= elem) l++;  

              if (l < r)  

              {  

                   a[r--] = a[l];  

              }  

         }  

         a[r] = elem;  

         QuickSort(a,low,r-1);  

         QuickSort(a,r+1,high);  

     }  

}
/*快速排序

左边比他小,右边比他大,每次得到一个最左边数据的位置*/

template<typename T>

void QuickSort(T a[],int low,int high)

{

     if(low < high)

     {

         T elem = a[low];

         int l = low, r = high;

         while(l < r)

         {  

              while(l < r && a[r] >= elem) r--;

              if (l < r)

              {

                   a[l++] = a[r];

              }

              while(l< r && a[l] <= elem) l++;

              if (l < r)

              {

                   a[r--] = a[l];

              }

         }

         a[r] = elem;

         QuickSort(a,low,r-1);

         QuickSort(a,r+1,high);

     }

}

[cpp] view plaincopyprint?
/*插入排序 

向右移,a[j+1]=a[j]*/  

template<typename T>  

void insert_sort(T a[],int n)  

{  

     int i,j;  

     T elem;  

     for (i= 1;i<n ;++i)  

     {  

         j = i- 1;  

         elem = a[i];  

         while(j>=0&& elem < a[j] )  

         {  

              a[j+1] = a[j]; j--;  

         }  

         a[j+1] = elem;  

     }  

}  

/*插入排序

向右移,a[j+1]=a[j]*/

template<typename T>

void insert_sort(T a[],int n)

{

     int i,j;

     T elem;

     for (i= 1;i<n ;++i)

     {

         j = i- 1;

         elem = a[i];

         while(j>=0&& elem < a[j] )

         {

              a[j+1] = a[j]; j--;

         }

         a[j+1] = elem;

     }

}

[cpp] view plaincopyprint?
/*希尔(shell)排序 

把插入排序的改成d即可*/  

template<typename T>  

void shell_insert(T array[],int d,int len)  

{     

     int i,j;  

    T elem;  

     for ( i = d;i < len;i++)     

     {        

         j = i - d;  

         elem = array[i];                         

         while (j >= 0&& elem < array[j])          

         {                  

              array[j+d] = array[j];                 

              j = j - d;             

         }            

         array[j+d] = elem;              

     }  

}  

template<typename T>  

void shell_sort(T array[],int len)  

{     

     int inc = len;     

     do      

     {         

         inc = inc/2;         

         shell_insert(array,inc,len);     

     }  

     while (inc >1);  

}  

/*希尔(shell)排序

把插入排序的改成d即可*/

template<typename T>

void shell_insert(T array[],int d,int len)

{   

     int i,j;

    T elem;

     for ( i = d;i < len;i++)   

     {      

         j = i - d;

         elem = array[i];                       

         while (j >= 0&& elem < array[j])        

         {                

              array[j+d] = array[j];               

              j = j - d;           

         }          

         array[j+d] = elem;            

     }

}

template<typename T>

void shell_sort(T array[],int len)

{   

     int inc = len;   

     do    

     {       

         inc = inc/2;       

         shell_insert(array,inc,len);   

     }

     while (inc >1);

}

[cpp] view plaincopyprint?
/*选择排序 

逐一比较,最小的放前面*/  

template <typename T>  

void SelectSort(T a[],int n)  

{  

     int i,j,elemNum;  

     T elem;  

     for (i=0;i<n-1;i++)  

     {  

         elemNum = i;  

         for (j= i+1;j<n;j++)  

         {  

              if (a[j] < a[elemNum])  

              {  

                   elemNum = j;  

              }  

         }  

         if (elemNum != i)  

         {  

              elem = a[i];  

              a[i] = a[elemNum];  

              a[elemNum] = elem;  

         }  

     }  

}
/*选择排序

逐一比较,最小的放前面*/

template <typename T>

void SelectSort(T a[],int n)

{

     int i,j,elemNum;

     T elem;

     for (i=0;i<n-1;i++)

     {

         elemNum = i;

         for (j= i+1;j<n;j++)

         {

              if (a[j] < a[elemNum])

              {

                   elemNum = j;

              }

         }

         if (elemNum != i)

         {

              elem = a[i];

              a[i] = a[elemNum];

              a[elemNum] = elem;

         }

     }

}

[cpp] view plaincopyprint?
/*堆排序 

a[s]>=a[2*s] &&a[s]>=a[2*s+1]*/  

template<typename T>  

void Max_heap(T a[],int S,int len)  

{  

     int l = 2*S;  

     int r = 2*S+1;  

     int maxI = S;  

     T elem;  

     if (l < len && a[l] > a[maxI])  

     {  

         maxI = l;  

     }  

     if (r < len && a[r] > a[maxI])  

     {  

         maxI = r;  

     }  

     if (maxI != S)  

     {  

         elem = a[S];  

         a[S] = a[maxI];  

         a[maxI] = elem;  

         Max_heap(a,maxI,len);  

     }  

}  

template<typename T>  

void HeapSort(T a[],int n)  

{  

     int i;  

     T elem;  

     for (i = n/2;i>=0;i--)  

     {  

         Max_heap(a,i,n);  

     }  

     for (i= n-1;i>=1;i--)  

     {  

         elem = a[0];  

         a[0] = a[i];  

         a[i] = elem;  

         n = n-1;  

         Max_heap(a,0,n);  

     }  

}
/*堆排序

a[s]>=a[2*s] &&a[s]>=a[2*s+1]*/

template<typename T>

void Max_heap(T a[],int S,int len)

{

     int l = 2*S;

     int r = 2*S+1;

     int maxI = S;

     T elem;

     if (l < len && a[l] > a[maxI])

     {

         maxI = l;

     }

     if (r < len && a[r] > a[maxI])

     {

         maxI = r;

     }

     if (maxI != S)

     {

         elem = a[S];

         a[S] = a[maxI];

         a[maxI] = elem;

         Max_heap(a,maxI,len);

     }

}

template<typename T>

void HeapSort(T a[],int n)

{

     int i;

     T elem;

     for (i = n/2;i>=0;i--)

     {

         Max_heap(a,i,n);

     }

     for (i= n-1;i>=1;i--)

     {

         elem = a[0];

         a[0] = a[i];

         a[i] = elem;

         n = n-1;

         Max_heap(a,0,n);

     }

}

[cpp] view plaincopyprint?
/*归并排序 

左边小左边,左边++;右边小取右边,右边++*/  

template<typename T>  

void merge(T array[], int low, int mid, int high)  

{  

     int k;  

     T *temp = new T[high-low+1]; //申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列   

     int begin1 = low;  

     int end1 = mid;  

     int begin2 = mid + 1;  

     int end2 = high;  

     for (k = 0; begin1 <= end1&& begin2 <= end2; ++k)  //比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置   

     {  

         if(array[begin1]<=array[begin2])  

              temp[k] = array[begin1++];  

         else  

              temp[k] = array[begin2++];    

     }  

    if(begin1 <= end1) //若第一个序列有剩余,直接拷贝出来粘到合并序列尾   

         memcpy(temp+k, array+begin1, (end1-begin1+1)*sizeof(T));  

    if(begin2 <= end2) //若第二个序列有剩余,直接拷贝出来粘到合并序列尾   

         memcpy(temp+k, array+begin2, (end2-begin2+1)*sizeof(T));  

    memcpy(array+low, temp, (high-low+1)*sizeof(T));//将排序好的序列拷贝回数组中   

    delete temp;  

}  

template<typename T>  

void merge_sort(T array[], unsigned int first, unsigned int last)  

{  

     int mid = 0;  

     if(first<last)  

     {  

         //mid = (first+last)/2; /*注意防止溢出*/   

         mid = first/2 +last/2;  

         //mid = (first & last) + ((first ^ last) >> 1);   

         merge_sort(array, first, mid);  

         merge_sort(array, mid+1,last);  

         merge(array,first,mid,last);  

     }  

}  

template<typename T>  

void Print(T* r,int n)  

{  

     for (int i=0;i<n;i++)  

     {  

         cout << r[i] << endl;  

     }  

}  

int main()  

{  

     cout << "Welcome..."<< endl;  

     double r[] ={1.5,3.2,5,6,9.2,7,2,4,8};  

     //BubbleSort(r,9);   

     QuickSort(r,0,8);  

     //insert_sort(r,9);   

     //shell_sort(r,9);   

     //SelectSort(r,9);   

     //HeapSort(r,9);   

//  merge_sort(r,0,8);   

     Print(r,9);  

     return 0;  

}

经典排序算法总结(代码) .(转)

时间: 2024-08-23 01:17:13

经典排序算法总结(代码) .(转)的相关文章

八大经典排序算法的代码实现

冒泡排序: 1 //冒泡排序 2 //时间复杂度为O(N^2),空间复杂度为O(N) 3 public class BubbleSort { 4 public static void bubbleSort(int[] arr) { 5 if (arr.length == 0 || arr.length == 1) { 6 return; 7 } else { 8 // 随着每轮比较的进行,都有一个大数沉到后面排好序,因此外层的循环长度应该递减 9 for (int end = arr.lengt

常见经典排序算法学习总结,附算法原理及实现代码(插入、shell、冒泡、选择、归并、快排等)

博主在学习过程中深感基础的重要,经典排序算法是数据结构与算法学习过程中重要的一环,这里对笔试面试最常涉及到的7种排序算法(包括插入排序.希尔排序.选择排序.冒泡排序.快速排序.堆排序.归并排序)进行了详解.每一种算法都有基本介绍.算法原理分析.算法代码. 转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/47280135 插入排序 1)算法简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过

十大经典排序算法的算法描述和代码实现

这里详细讲解了十大经典算法的分类,例如交换排序.插入排序.选择排序等比较类排序,以及计数排序.桶排序和基数排序的非比较类排序,分析了各种排序算法的复杂度和稳定性,还有JAVA代码的详细实现.对冒泡排序.插入排序.选择排序和堆排序等十种算法进行了详细的思想总结. 一.算法概述 1.算法分类 十种常见排序算法可以分为两大类:(1)比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn)因此也称为非线性时间比较类排序.(2)非比较类排序:不通过比较元素间的相对次序,它可以突

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

Python实现各种排序算法的代码示例总结

Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示例总结,其实Python是非常好的算法入门学习时的配套高级语言,需要的朋友可以参考下 在Python实践中,我们往往遇到排序问题,比如在对搜索结果打分的排序(没有排序就没有Google等搜索引擎的存在),当然,这样的例子数不胜数.<数据结构>也会花大量篇幅讲解排序.之前一段时间,由于需要,我复习了

经典排序算法 - 归并排序Merge sort

经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 4 1 5 9] 先看一下每一个步骤下的状态,完了再看合并细节 第一步 [6 2 4 1 5 9]原始状态 第二步 [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍 第三步 [1 2 4 6] [5 9]继续两组两组合并 第四步 [1 2 4 5 6 9]合并完成,排序完成 输出结

七种经典排序算法最全攻略

经典排序算法在面试中占有很大的比重,也是基础.包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序.希望能帮助到有需要的同学.全部程序采用JAVA实现. 本篇博客所有排序实现均默认从小到大. 一.冒泡排序 BubbleSort 介绍: 冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来. 步骤: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对第0个到第n-1个数据做同样的工作.这时,最大的数就"浮"到了

经典排序算法(Java实现)

以下程序均将数据封装于DataWrap数据包装类中,如下所示: 1 //数据包装类 2 class DataWrap implements Comparable<DataWrap> 3 { 4 int data; 5 String flag; 6 public DataWrap(int data,String flag) 7 { 8 this.data = data; 9 this.flag = flag; 10 } 11 //重写compareTo方法 12 public int compa

经典排序算法 – 插入排序Insertion sort

经典排序算法 – 插入排序Insertion sort  插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种,这里只介绍直接插入排序,折半插入排序留到“查找”内容中进行.   图1演示了对4个元素进行直接插入排序的过程,共需要(a),(b),(c)三次插入. 以下代码仅供参考,欢迎指正 /// <summary> /// 插入排序 /// </summary> /// <param na