zoukankan      html  css  js  c++  java
  • 经典排序算法

    冒泡排序

    template<typename T>
    //整数或浮点数皆可使用
    void bubble_sort(T arr[], int len)
    {
        int i, j;  T temp;
        for (i = 0; i < len - 1; i++) { 
            bool flag = false;   
            for (j = 0; j < len - 1 -i; j++) { 
              if (arr[j] > arr[j + 1])
              {
                  temp = arr[j];
                  arr[j] = arr[j + 1];
                  arr[j + 1] = temp;
                  flag = true;
              }
            }
            if (flag == true)
              break;    // 剪枝操作
        }
    }
    int main()
    {
        int arr[] = { 61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 };
        int len = (int) sizeof(arr) / sizeof(*arr);
        bubble_sort(arr, len);
        for (int i = 0; i < len; i++)
            cout << arr[i] << ' ';
     
        cout << endl;
     
        float arrf[] = { 17.5, 19.1, 0.6, 1.9, 10.5, 12.4, 3.8, 19.7, 1.5, 25.4, 28.6, 4.4, 23.8, 5.4 };
        len = (int) sizeof(arrf) / sizeof(*arrf);
        bubble_sort(arrf, len);
        for (int i = 0; i < len; i++)
            cout << arrf[i] << ' ';
    }
    

    快排

    快排1

    #include <iostream>
     
    using namespace std;
     
    void Qsort(int arr[], int low, int high){
        if (high <= low) return;
        int i = low ;
        int j = high + 1 ;
        int key = arr[low];
        while (true)
        {
            /*从左向右找比key大的值*/
            // i = 8;
            // ++i = 9; arr[++i] < key 这个条件符合 i = 9 
            //question : 如果 
            while (arr[++i] < key)
            {
                if (i == high){
                    break;
                }
            }        
            /*从右向左找比key小的值*/
            while (arr[--j] > key)
            {
                if (j == low){
                    break;
                }
            }
            if (i > j) break;
            /*交换i,j对应的值*/
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        /*中枢值与j对应值交换*/
        int temp = arr[low];
        arr[low] = arr[j];
        arr[j] = temp;
        Qsort(arr, low, j - 1);
        Qsort(arr, j + 1, high);
    }
     
    int main()
    {
        int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24};
        /*
        low                            high
        57, 24, 59, 52, 72, 28, 96, 33, 68
            i                           j
        57, 24, 33, 52, 72, 28, 96, 59, 68
                i                   j
        57, 24, 33, 52, 28, 72, 96, 59, 68
                        i   j
        57, 24, 33, 52, 28, 72, 96, 59, 68  
                        j   i                 i丛左向右搜索找到合适的大于key值的a[i] ,j从右向左检索到合适的大于key值的a[j]
                                              但是i > j ,导致a[i] 与 a[j] 不会引起交换,而且这次分类结束,break 跳出while 
                                              循环。  
        28, 24, 33, 52, 57, 72, 96, 59, 68 
                        j   i             a[low] 和 a[j] 换一下位置
    
        */
        Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/
     
        for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
        {
            cout << a[i] << "    ";
        }
        system("pause");
    }/*参考数据结构p274(清华大学出版社,严蔚敏)*/
    

    快排2

    #include<vector>
    #include<iostream>
    using namespace std;
    //快速排序(从小到大)
    void quickSort(int left, int right, vector<int>& arr )
    {
    	if (left >= right)
    		return;
    	int i, j, base, temp;
    	i = left, j = right;
    	base = arr[left];  //取最左边的数为基准数
    	while (i < j)
    	{
    		// 顺序不能颠倒
    		while (arr[j] >= base && i < j)
    			j--;
    		while (arr[i] <= base && i < j)
    			i++;
    		if (i < j)
    		{
    			temp = arr[i];
    			arr[i] = arr[j];
    			arr[j] = temp;
    		}
    	}
    	//基准数归位
    	arr[left] = arr[j];
    	arr[j] = base;
    	quickSort(left, j - 1, arr);//递归左边
    	quickSort(j + 1, right, arr);//递归右边
    }
    
    举个例子 7 0 1 2 10 11 22 key取7你让i先++的话i就会走到10最后key归位的时候就会交换10和7
    
    int main() {
    	vector<int> arr = { 4,2,7,36,743,23,47,3,23,33,7,33 };
    	int length = arr.size();
    	quickSort(0, length-1, arr);
    	for (auto num : arr)
    		cout << num << "  ";
    	cout << endl;
    	return 0;
    }
    

    归并排序

    void MergeSort (int arr [], int low,int high) {
        if(low>=high) { return; } // 终止递归的条件,子序列长度为1
        int mid =  low + (high - low)/2;  // 取得序列中间的元素
        MergeSort(arr,low,mid);  // 对左半边递归
        MergeSort(arr,mid+1,high);  // 对右半边递归
        merge(arr,low,mid,high);  // 合并
    }
    
    void Merge(int arr[],int low,int mid,int high) {
        //low为第1有序区的第1个元素,i指向第1个元素, mid为第1有序区的最后1个元素
        int i=low,j=mid+1,k=0;  //mid+1为第2有序区第1个元素,j指向第1个元素
        int *temp=new int[high-low+1]; //temp数组暂存合并的有序序列
        while(i<=mid&&j<=high){
            if(arr[i]<=arr[j]) //较小的先存入temp中
                temp[k++]=arr[i++];
            else
                temp[k++]=arr[j++];
        }
        while(i<=mid)//若比较完之后,第一个有序区仍有剩余,则直接复制到t数组中
            temp[k++]=arr[i++];
        while(j<=high)//同上
            temp[k++]=arr[j++];
        for(i=low,k=0;i<=high;i++,k++)//将排好序的存回arr中low到high这区间
    	arr[i]=temp[k];
        delete []temp;//释放内存,由于指向的是数组,必须用delete []
    }
    

    插入排序

    
    #include<iostream>
    #include<cstdlib>
     
    using namespace std;
     
    //交换数组元素位置位置
    void swap(int &a, int &b)
    {
    	int temp = a;
    	a = b;
    	b = temp;
    }
     
     
    /*
    插入排序。注意,若后面一个元素比其前面一个元素小,则将这两个元素交换位置,然后再来比较这个插入元素与前面一个元素的大小,若小,则还需要交换这两个元素位置,一直到这个插入元素在正确的位置为止
    */
    void insertSort(int a[],  int length)
    {
    	for (int i = 1; i < length; i++)
    	{
    		for (int j = i - 1; j >= 0 && a[j + 1] < a[j]; j--)
    		{
    			swap(a[j], a[j + 1]);
    		}
    	}
     
    }
     
    int main()
    {
    	int a[] = { 2,1,4,5,3,8,7,9,0,6 };
     
    	insertSort(a, 10);
     
    	for (int i = 0; i < 10; i++)
    	{
    		cout << a[i] << "";
     
    	}
    	cout << endl;
    	system("pause");
    	return 0;
     
    }
    

    shell 排序

    
    #include<iostream>
     
    using namespace std;
    const int INCRGAP = 3;
    void shellsort1(int a[], int n)
    {
        int i, j, gap;
    
        for (gap = n / 2; gap > 0; gap /= 2) //步长
            for (i = 0; i < gap; i++)        //直接插入排序
            {
                for (j = i + gap; j < n; j += gap) 
                    if (a[j] < a[j - gap])
                    {
                        int temp = a[j];
                        int k = j - gap;
                        while (k >= 0 && a[k] > temp)
                        {
                            a[k + gap] = a[k];
                            k -= gap;
                        }
                        a[k + gap] = temp;
                    }
            }
    }
    int main()
    {
        int array[11] = {2, 1, 4, 3, 11, 6, 5, 7, 8, 10, 15};
        shellSort(array, 11);
        for(auto it: array)
        {
            cout<<it<<endl;
        }
        return 0;
    }
    

    堆排

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    
    void max_heapify(int arr[], int start, int end) {
        int dad = start; int son = dad * 2 + 1;
    
        while ( son <= end ){
            if (son + 1 <= end && arr[son] < arr[son+1]){
                son++;
            }
            if (arr[dad] > arr[son]){
                return;
            } else {
                swap(arr[dad], arr[son]);
                dad = son; 
                son = dad * 2 + 1;
            }
        }
    }
    
    void heap_sort(int arr[], int length){
        for(int i = length / 2 - 1; i >= 0; i--){
            max_heapify(arr, i, length-1);  // 这样的话是大堆顶
        }
        for(int i = length - 1; i >= 0; i--){
            swap(arr[0], arr[i]);
            max_heapify(arr,0,i-1);
        }
    
    }
    
    int main(){
        int arr[] = { 4,6,1,32,56,7,2,3,5,3};
        int length  = sizeof(arr) / sizeof(*arr);
        heap_sort(arr, length);
        for(int i = 0; i < length; i++){
            cout << arr[i]  << "   ";
        }
        system("pause");
        return 0;
    }
    
    
  • 相关阅读:
    Spring MVC Ajax 嵌套表单数据的提交
    Spring MVC 过滤静态资源访问
    Spring MVC 页面跳转时传递参数
    IDEA Maven 三层架构 2、运行 springMVC
    IDEA Maven 三层架构 1、基本的Archetype 搭建
    EasyUI DataGrid 基于 Ajax 自定义取值(loadData)
    Spring MVC Ajax 复杂参数的批量传递
    Mybatis Sql片段的应用
    在 Tomcat 8 部署多端口项目
    自动升级的设计思路与实现
  • 原文地址:https://www.cnblogs.com/wsl-hitsz/p/14799989.html
Copyright © 2011-2022 走看看