各种sort

冒泡排序 Bubble Sort  O(N^2)

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    伪代码
    function bubble_sort (array, length) {
        var i, j;
        for(i from 0 to length-1){
            for(j from 0 to length-1-i){
                if (array[j] > array[j+1])
                    swap(array[j], array[j+1])
            }
        }
    }
    
    JAVA
        public int[] bubble_sort(int[] arr) {
            int i, j, temp, len = arr.length;
            for (i = 0; i < len - 1; i++)
                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;
                    }
            return arr;
        }

选择排序 select sort

    是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

public static void selection_sort(int[] arr) {
    int i, j, min, temp, len = arr.length;
    for (i = 0; i < len - 1; i++) {
        min = i;
        for (j = i + 1; j < len; j++)
            if (arr[min] > arr[j])
                min = j;
        temp = arr[min];
        arr[min] = arr[i];
        arr[i] = temp;
    }
}

插入排序 insert sort

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5

        public static void insertion_sort(int[] arr)
        {
            for (int i = 1; i < arr.length; i++ ) {
                int temp = arr[i];
                int j = i - 1;  // 如果将赋值放到下一行的for循环内, 会导致在第10行出现j未声明的错误
                for (; j >= 0 && arr[j] > temp; j-- ) {
                    arr[j + 1] = arr[j];
                }
                arr[j + 1] = temp;
            }
        }

快速排序

 * @brief 虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。
  *        因此我的对快速排序作了进一步的说明:挖坑填数+分治法:
  * @param R为待排数组,low和high为无序区
  *        时间复杂度:最好O(nlogn),最坏O(n^2),平均O(nlogn),空间复杂度O(logn);
  */
void quickSort(int R[], int low, int high)
{
    if ( low < high ) {
        int i = low, j = high, temp = R[low];  

        while ( i < j ) {
            //从右往左扫描,如果数组元素大于temp,则继续,直至找到第一个小于temp的元素
            while ( i < j && R[j] >= temp ) {
                --j;
            }
            if ( i < j ) {
                R[i++] = R[j];
            }
            while ( i < j && R[i] <= temp ) {
                ++i;
            }
            if ( i < j ) {
                R[j--] = R[i];
            }
        }
        R[i] = temp;
        quickSort(R, low, i - 1);
        quickSort(R, i + 1, high);
    }
} 
时间: 2024-08-03 14:21:50

各种sort的相关文章

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

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

Redis学习之Sort Set详解

本文和大家分享的主要是Redis中Sort Set相关内容,一起来看看吧,希望对大家学习redis有所帮助. 游戏服务器需要做一个排行榜实时更新,如果沿用传统的方法,一般是通过后端的定时任务去跑数据来生成排行榜数据,这种方法一方面无法满足产品对功能实时性的要求,另一方面也一定程度上消耗服务器端有限的资源.如果从每次数据库读取数据并进行排名(使用Mysql的sort关键字进行排序),在关卡数据量的级数大时是一种效率低的方法.在查阅大量资料后,发现了Redis中的有序集合(Sort Set). Re

75. Sort Colors

Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue. Here, we will use the integers 0, 1, and 2 to represent the color red, white, and bl

[BZOJ1552][Cerc2007]robotic sort

试题描述 输入 输入共两行,第一行为一个整数N,N表示物品的个数,1<=N<=100000.第二行为N个用空格隔开的正整数,表示N个物品最初排列的编号. 输出 输出共一行,N个用空格隔开的正整数P1,P2,P3-Pn,Pi表示第i次操作前第i小的物品所在的位置. 注意:如果第i次操作前,第i小的物品己经在正确的位置Pi上,我们将区间[Pi,Pi]反转(单个物品). 输入示例 6 3 4 5 1 6 2 输出示例 4 6 4 5 6 6 数据规模及约定 见"输入" 题解 暴力

PROC SORT

PROC SORT DATA=输入数据集 <OUT=输出数据集><选项>; BY 关键变量; RUN; PROC SORT 语法如上,其中在尖括号中的可以不出现,也不会报错. 选项中常用的有两种NODUPKEY和NOUNIQUEKEY. 功能可以由字面意思帮助记忆,NO-没有,DUP-重复,KEY-关键变量,,,合起来就是数据集中指定的关键变量不重复, 其功能也一样,,去除重复的关键变量,这里的关键变量就是指跟在关键字BY后面的变量:还有一个对应的DUPOUT=选项用来输出被该(N

PAT甲题题解-1101. Quick Sort (25)-大水题

快速排序有一个特点,就是在排序过程中,我们会从序列找一个pivot,它前面的都小于它,它后面的都大于它.题目给你n个数的序列,让你找出适合这个序列的pivot有多少个并且输出来. 大水题,正循环和倒着循环一次,统计出代码中的minnum和maxnum即可,注意最后一定要输出'\n',不然第三个测试会显示PE,格式错误. #include <iostream> #include <cstdio> #include <algorithm> #include <map&

八大排序算法之三选择排序—简单选择排序(Simple Selection Sort)

基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止. 简单选择排序的示例: 操作方法: 第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换: 第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换: 以此类推..... 第i 趟,则从第i 个记录开始的n-i+1 个记录中选出关键码最小的记录与

使用 redis (sort set排序集合类型操作)

sort set排序集合类型 释义: sort set 是 string 类型的集合 sort set 的每个元素 都会关联一个 权 通过 权值 可以有序的获取集合中的元素 应用场合: 获取热门帖子(回复量)信息: select * from message order by backnum desc limit 5; // 利用 sort set 实现最热门的前 5 贴信息 帖子id            回复量(万条) 11                102        12     

Wiggle Sort II

Wiggle Sort II Given an unsorted array nums, reorder it such that nums[0] < nums[1] > nums[2] < nums[3].... 注意事项 You may assume all input has valid answer. 样例 Given nums = [1, 5, 1, 1, 6, 4], one possible answer is [1, 4, 1, 5, 1, 6]. Given nums

sort排序

<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>sort排序</title> </head> <body> <script type="text/javascript"> var arr = [3,1,0,7,6,5,4,9]; document.write("原数组:"