常见排序算法杂记

#include<iostream>
#include<cstdlib>
using namespace std;

void SelectSort(int *a, int n) {
     int min;
     for (int i = 0; i < n - 1; i++) {
        min = i;
         for (int j = i+1; j < n; j++) {
            if (a[min] > a[j]) {
                min = j;              
            }         
        }
        if (min != i) {
            swap(a[min], a[i]);           
        }      
     }
}

void MergeArray(int a[], int left, int mid, int right, int tmp[]) {
     int i = left, j = mid+1, k = 0;
     while (i <= mid && j <= right) {
            if (a[i] > a[j]) {
                     tmp[k++] = a[j++];         
           } else {
                    tmp[k++] = a[i++];             
           }
     }
     while (i <= mid) {
            tmp[k++] = a[i++];
     }
     while (j <= right) {
           tmp[k++]= a[j++];       
     }
     for (int l = 0; l < k; l++) {
            a[l+left] = tmp[l];     
     }
}

void MergeSort(int a[], int left, int right, int tmp[]) {
     if (left < right) {
           int mid = (left + right) / 2;
          MergeSort(a, left, mid, tmp);
          MergeSort(a,mid+1,right,tmp);
          MergeArray(a,left, mid, right, tmp);       
     }     
}

void QuickSort(int left, int right, int *a) {
    if (left < right) {
       int i = left, j = right, index = a[i];
       while (i < j) {
           while (i < j && a[j] >= index) {
                j--;
           }
           if (i < j) {
                 a[i++] = a[j];           
           }
           while (i < j && a[i] <= index  ) {
                 i++;
           }
           if (i < j) {
                 a[j--] = a[i];           
           }         
       }
       a[i] = index;
       QuickSort(left, i-1, a);
       QuickSort(i+1,right, a);            
    }      
}

void InsertSort(int *a, int n) {
     int pos, j, tmp;
     //插入排序是从第gap位开始的,gap = 1往前插入。 
     for (int i = 1; i < n; i++) {
         j = i - 1; 
         if (a[i] > a[j]) continue;
         tmp = a[i];
         //尝试二分操作, 若用顺序操作的话,我们可以把搜索和移位放在一起  
         int left = 0, right = i, mid;
         //这里的<=是为了防止忽略了值相等的情况下将插入的值放前面而破坏排序稳定性。 
         while (left <= right) {
                mid = (left + right) / 2;
                if (a[i] >= a[mid]) {
                     left = mid + 1;                
               } else {
                   right = mid - 1;           
               }
         } 
         /*
         while (j < pos) {
             if (a[j] > a[pos]) {
                 break;          
             }       
             j++;
         }*/
         
         for (; j >= left; j--) {
             a[j+1] = a[j];     
         }     
         a[left] = tmp;
     }     
}

//如果里层循环是往后搜的话,每一内循环是将最大的放在后面,
//而不是把最小的放在前面,里层循环比外层少i,i为已经移动最大数的次数。 
//可以设置里层是否已经交换来检测冒泡是否可以早些完毕 
int BubbleSort(int * a, int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - 1 - i; j++) {
            if (a[j] > a[j+1])    {
               swap(a[j],a[j+1]);            
            }
        }
    }
}

//下面的是希尔增量
//还有Hibbard:{1, 3, ..., 2^k-1},
//Sedgewick:{1, 5, 19, 41, 109...}该序列中的项是9*4^i - 9*2^i + 1和4^i - 3*2^i + 1交替得到。 
int ShellSort(int *a, int n) {
    
    int gap = n / 2, j, tmp;
    while (gap > 0) {
          //注意点1,i是inc的,因为这个方法是第二组,第三组,第四组的第二个数开始比较。
          //是每组比较完再到下一组 
        for(int i = gap; i < n; i++) {
            if (a[i - gap] < a[i]) continue;    
            j = i -gap; 
            tmp = a[i];
            //将移位和搜索放一起 
            //注意点2:  a[j] > a[i]致命错误,因为a[i]被覆盖了 
            while ((j >= 0) && (a[j] > tmp)) {
                a[j+gap] = a[j]; 
                j -= gap;  
            }
            a[j+gap] = tmp;
         }
        gap /= 2;      
    } 
 } 
 
void HeapSort() {
          
}

void RadixSort() {
     
}

int main() {
    int a[10], tmp[10];
    for (int i = 0; i < 10; i++) {
        a[i] = rand()%10;
    }
    for (int i = 0; i< 10; i++) {
        cout << a[i] << " ";    
    }
    cout << endl;
    //MergeSort(a,0,100-1,tmp);
    ShellSort(a,10);
    for (int i = 0; i< 10; i++) {
        cout << a[i] << " ";    
    }
    system("pause");
}

//Mark一下http://www.cs.usfca.edu/~galles/visualization/Algorithms.html

时间: 2025-01-31 07:15:11

常见排序算法杂记的相关文章

【整理】常见排序算法及其时间复杂度总结

原文出处: 1. 白话经典算法系列之八 MoreWindows白话经典算法之七大排序总结篇 2. 面试常用算法总结--排序算法(java版) 3. 常见排序算法小结 本篇主要整理了冒泡排序,直接插入排序,直接选择排序,希尔排序,归并排序,快速排序,堆排序七种常见算法,是从上面三篇博文中摘抄整理的,非原创. 一.冒泡排序 主要思路是: 通过交换相邻的两个数变成小数在前大数在后,这样每次遍历后,最大的数就"沉"到最后面了.重复N次即可以使数组有序. 冒泡排序改进1: 在某次遍历中,如果没有

常见排序算法(一) MergeSort

算法思想灰常重要,常见的用到分治思想的算法包括快速排序,归并,二分搜搜,大整数乘法等(参考 http://blog.csdn.net/com_stu_zhang/article/details/7233761,归纳很到位) 简单用归并对一个数组排序 思路: 简单来说对一个数组,只要他的左右两部分都是有序的,那么简单合并就ok了,那么左右两部分可以进一步划分各自的左右两部分----明显就是要递归了 算法:归并排序 1. 将数组一分为二,subArray1 和subArray2 2. 归并排序sub

常见排序算法(java实现)

常见排序算法介绍 冒泡排序 代码: public class BubbleSort { public static void sort(int[] array) { int tValue; for (int i = 0; i < array.length; i++) { for (int j = i; j < array.length; j++) { if (array[i] > array[j]) { tValue = array[i]; array[i] = array[j]; ar

常见排序算法(冒泡、选择、插入、快速、归并C++实现)

常见排序算法(冒泡.选择.插入.快速.归并C++实现) #include <iostream> using namespace std; // 冒泡排序 void bubbleSort (int data[], size_t size) { for (size_t i = 0; i < size - 1; ++i) { bool ordered = true; for (size_t j = 0; j < size - 1 - i; ++j) if (data[j+1] <

几种常见排序算法

几种常见排序算法 几种常见排序算法 写在前面 基础介绍 初级排序算法 selection sort选择排序 insertion sort插入排序 ShellSort希尔排序 shuffing不是排序算法 merge sort归并排序 Abstract in-place merge原地归并的抽象方法 Top-down mergesort自顶向下的归并排序 Bottom-up mergesort自底向上的归并排序 quicksort 三向切分的快速排序 Heapsort堆排序 总结和比较 命题 本文

第六章 常见排序算法

上章回顾 二叉树的定义 树深度的定义 什么样的二叉树是满二叉树 中序遍历的规则 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 第六章 第六章 常见排序算法 常见排序算法 [email protected]:Kevin-Dfg/[email protected]:Kevin-Dfg/Data-Structures-and-Algorith

常见排序算法总结(java实现)

所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.常见的排序算法有选择排序,插入排序,希尔排序,归并排序和快速排序 由于在排序的过程中不可避免的要涉及到比较和交换,所以将他们抽取为两个单独的函数,如下所示 //为了排序代码的通用性,这里假定待排序的元素实现了Comparable接口 private static boolean less(Comparable v ,Comparable w){ return v.compareTo(w)<0; } priva

十种常见排序算法

1.常见算法分类 十种常见排序算法一般分为以下几种: (1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序).插入类排序(简单插入排序和希尔排序).选择类排序(简单选择排序和堆排序).归并排序(二路归并排序和多路归并排序): (2)线性时间非比较类排序:计数排序.基数排序和桶排序. 总结: (1)在比较类排序中,归并排序号称最快,其次是快速排序和堆排序,两者不相伯仲,但是有一点需要注意,数据初始排序状态对堆排序不会产生太大的影响,而快速排序却恰恰相反. (2)线性时间非比较类排序一般要优于

常见排序算法(PHP实现)

function InsertSort($arr){ $num = count($arr); for($i = 1; $i < $num; $i++){ $key = $arr[$i]; for($j = $i - 1; $j >= 0; $j--){ if($arr[$j] > $key){ $arr[$j + 1] = $arr[$j]; $arr[$j] = $key; } } } return $arr; } function BubbleSort($arr){ $num = c