排序算法之0-1、0-1-2排序

之前碰到个非常有意思的题目,是关于排序算法的题目:

已知:一个数组:array,数组元素:0或1或2

求解:将数组按照0-1-2排序?

  1 template <class T>
  2 void Swap(T& t1, T& t2)
  3 {
  4     T tmp = t1;
  5     t1 = t2;
  6     t2 = tmp;
  7 }
  8
  9 // Sorting a array which the elements are 0 or 1.
 10 void SortArray_0_1(int* arr, int n)
 11 {
 12     int first = 0;      // point to 0.
 13     int last = n - 1;   // point to 1.
 14
 15     while (first < last)
 16     {
 17         // Find the position of first 0.
 18         while (0 == arr[first])
 19         {
 20             first++;
 21         }
 22
 23         // Find the position of first 1.
 24         while (1 == arr[last])
 25         {
 26             last--;
 27         }
 28
 29         if (first <= last && 1 == arr[first] && 0 == arr[last])
 30         {
 31             Swap(arr[first], arr[last]);
 32             first++;
 33             last--;
 34         }
 35     }
 36 }
 37
 38 // Sorting a array which the elements are 0 or 1.
 39 void SortArray2_0_1(int* arr, int n)
 40 {
 41     //int first = 0;      // point to 0.
 42     int last = n - 1;   // point to 2.
 43     int k = 0;          // point to 1.
 44
 45     while (k < last)
 46     {
 47         // Find 0.
 48         if (1 == arr[k])
 49         {
 50             while (1 == arr[last] && k < last)
 51             {
 52                 last--;
 53             }
 54
 55             if (k < last)
 56             {
 57                 Swap(arr[k], arr[last]);
 58             }
 59         }
 60
 61         if (0 == arr[k])
 62         {
 63             k++;
 64         }
 65     }
 66 }
 67
 68 // Sorting a array which the elements are 0 or 1 or 2.
 69 void SortArry_0_1_2(int* arr, int n)
 70 {
 71     int first = 0;      // point to 0.
 72     int last = n - 1;   // point to 2.
 73     int k = 0;          // point to 1.
 74
 75     while (k < last)
 76     {
 77         // Find 0.
 78         if (0 == arr[k])
 79         {
 80             while (0 == arr[first] && first < k)
 81             {
 82                 first++;
 83             }
 84
 85             if (first < k)
 86             {
 87                 Swap(arr[k], arr[first]);
 88             }
 89         }
 90
 91         // Find 1.
 92         if (1 == arr[k] || k == first)
 93         {
 94             k++;
 95         }
 96
 97         // Find 2.
 98         if (2 == arr[k])
 99         {
100             while (2 == arr[last] && k < last)
101             {
102                 last--;
103             }
104
105             if (k < last)
106             {
107                 Swap(arr[k], arr[last]);
108             }
109         }
110     }
111 }
时间: 2024-11-05 20:44:25

排序算法之0-1、0-1-2排序的相关文章

三种线性排序算法(计数、基数、桶排序)的简单实现

一.计数排序 计数排序假设n个输入元素中的每一个都是介于0到k之间的整数.此处k为某个整数(输入数据在一个小范围内). 基本思想: 计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数.然后再将x直接放置在它在最终输出数组中的位置上. 如下图所示: 由于数组中可能有相等的数,在处理时需要注意. 时间复杂度和空间复杂度分析 算法总时间Θ(k + n).当k=O(n)时,计数排序的运行时间是Θ(n). 空间复杂度是O(n+k).需要两个辅助数组:存放排序结果的数组B[n],存放临时结果的

常见的五类排序算法图解和实现(多关键字排序:基数排序以及各个排序算法的总结)

基数排序思想 完全不同于以前的排序算法,可以说,基数排序也叫做多关键字排序,基数排序是一种借助“多关键字排序”的思想来实现“单关键字排序”的内部排序算法. 两种方式: 1.最高位优先,先按照最高位排成若干子序列,再对子序列按照次高位排序 2.最低位优先:不必分子序列,每次排序全体元素都参与,不比较,而是通过分配+收集的方式. 多关键字排序 例:将下表所示的学生成绩单按数学成绩的等级由高到低排序,数学成绩相同的学生再按英语成绩的高低等级排序.        第一个关键字是数学成绩,第二个关键字是英

选择排序算法实现十个1-100的随机数的排序

public class Mian {//对数进行选择排序 public static void selectnumber(int[] number){ for(int i=0;i<number.length-1;i++){ int m=i; for(int j=i+1;j<number.length;j++){ if(number[j]<number[m]){ m=j; } if(i!=m){ swap(number,i,m); } } } } //交换两个数 public stati

排序算法(三)冒泡、选择排序的Python实现及算法优化详解

说在前面 最近一年太忙,博客长草了.近日用Python实现了常用排序算法,供大家参考. Java版本排序算法及优化,请看以前的文章. <排序算法之简单排序(冒泡.选择.插入)> <排序算法(二)堆排序> 1.排序概念 这里不再赘述,请参看前面2篇文章 2.简单排序之冒泡法Python实现及优化 原理图 2.1.基本实现 num_list = [     [1, 9, 8, 5, 6, 7, 4, 3, 2],     [1, 2, 3, 4, 5, 6, 7, 8, 9] ] nu

超级具体解读基本排序算法(不看懊悔,带排序演示动画)

排序与我们日常生活中息息相关.比方.我们要从电话簿中找到某个联系人首先会依照姓氏排序.买火车票会依照出发时间或者时长排序.买东西会依照销量或者好评度排序.查找文件会依照改动时间排序等等.在计算机程序设计中,排序和查找也是最主要的算法,非常多其它的算法都是以排序算法为基础,在一般的数据处理或分析中.通常第一步就是进行排序,比方说二分查找.首先要对数据进行排序.在Donald Knuth 的计算机程序设计的艺术这四卷书中.有一卷是专门介绍排序和查找的. 排序的算法有非常多.在维基百科上有这么一个分类

Java中的几种排序算法:冒泡排序,插入排序,二分法排序,简单排序,快速排序

冒泡排序: int[] hehe={4,7,2,5,6,9,0}; for(int i=0;i<hehe.length;i++){ for(int j=i+1;j<hehe.length;j++){ if(hehe[i]>hehe[j]){ int temp=hehe[i]; hehe[i]=hehe[j]; hehe[j]=temp; } } } 插入排序 int[] a={13,7,8,9,10,1,2,32}; int i,j,t,h; for (i=1;i<a.length

【排序算法】【转】09外部排序

[漫画]什么是外部排序? 原文地址:https://www.cnblogs.com/apeway/p/10818578.html

Java中的基础排序算法(二):简单选择排序、堆排序

参考文章:https://mp.weixin.qq.com/s/VjqZNPg6dAEReAzqZcb_yw 原文链接:www.jianshu.com/p/5e171281a387 原文地址:https://www.cnblogs.com/lotuses/p/11640671.html

排序算法Java版,以及各自的复杂度,以及由堆排序产生的top K问题

常用的排序算法包括: 冒泡排序:每次在无序队列里将相邻两个数依次进行比较,将小数调换到前面, 逐次比较,直至将最大的数移到最后.最将剩下的N-1个数继续比较,将次大数移至倒数第二.依此规律,直至比较结束.时间复杂度:O(n^2) 选择排序:每次在无序队列中"选择"出最大值,放到有序队列的最后,并从无序队列中去除该值(具体实现略有区别).时间复杂度:O(n^2) 直接插入排序:始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的 移动数据,空出一个适当的位置,把待插

重温排序算法

因为复试时老师比较喜欢问排序算法那,所以 最近又把排序算法温习一遍,顺便写写代码. 1直接插入排序. #include <stdio.h> void InsSort(int r[], int n) { int i, j, temp; for(i = 1; i < n; i++) { temp = r[i]; j = i - 1; while(temp < r[j]) //寻找带插入的位置 { r[j+1] = r[j]; j = j - 1; } r[j+1] = temp; //