排高低:冒泡与插入排序。不要管别人,自己设计的才是自己的。

算法问题的一个分类:排高低。

背景:有一系列的值,有大有小,由于某个目的(比如两两分组让最小者的和最大、比如容纳最多和不超过某个值的元素、等等),需要先把它们排一下高低。

一个数值数组,怎么给里面的元素排出高低(比如由小到大地排序)?

两两比较不是问题,要解决的是这两个问题:

* 谁跟谁比,怎么安排?

* 比后怎么处置,怎么让问题变小?

全由你来设计!

设计原则:让问题变小,最终没有。

不能随意地比较,比如安排单数的元素来比较,这个设计看不出能解决问题。

不能比完之后却没有进一步的动作,只比较却不记录也不作换位之类,明显没有意义。

谁来比,以及比后怎么处置,不同的安排,产生不同的算法。

为了简化思考,可以只考虑只有两个元素的情况。

比如:

* 让n1跟n2比较,如果n1>n2,则值互换位置,让n1最小。然后,继续让n1与n3比较,同样最小的放到n1”。全部比较完后,第一个位置就是最小的,之后再同样考虑第二个位置(问题规模在收敛)。这是“冒泡排序”算法。

* 让n1跟最后一个比较,再跟倒数第二个比较,…,小的放到n1。再考虑n2…。这是“冒泡排序”算法。

* 让n1跟n2比,n2跟n3比…,大者放到后面。一轮下来,最后的位置就是最大值,然后放过这个位置再重复。这是“冒泡排序”算法。

* 模拟排队(从一个都没有开始),从左往右,找到一个比自己高的元素,排到前面。这是“插入排序”。

* 第一个跟最后一个比较,第二个跟倒数第二个比较,…,小的放到左边,大的放到右边。这是“快速排序”的初型。

注意,“谁来比”不要有遗漏,否则不公平。

以上,更多想说明,你可以自己设计,并不一定要从已知的算法去思考。同时也说明了,冒泡排序插入排序的思路以及快速排序的初型。



#include <stdio.h>

#include <stdlib.h>

#include <string.h>

void bubble1(int* arr, int size) {

for (int i = 0; i < size-1; i ++) {

for (int j = i+1; j < size; j ++) {

if (arr[i] > arr[j]) {

arr[i]=arr[i] ^ arr[j];

arr[j]=arr[i] ^ arr[j];

arr[i]=arr[i] ^ arr[j];

}

}

}

}

void bubble2(int* arr, int size) {

for (int i = 0; i < size-1; i ++) {

for (int j = size-1; j > i; j --) {

if (arr[i] > arr[j]) {

arr[i]=arr[i] ^ arr[j];

arr[j]=arr[i] ^ arr[j];

arr[i]=arr[i] ^ arr[j];

}

}

}

}

void bubble3(int* arr, int size) {

int count = size;

while (count) {

for (int i = 0; i < count-1; i ++) {

if (arr[i] > arr[i+1]) {

arr[i]=arr[i] ^ arr[i+1];

arr[i+1]=arr[i] ^ arr[i+1];

arr[i]=arr[i] ^ arr[i+1];

}

}

count --;

}

}

// 多用一个临时组

void insertsort(int* arr, int size) {

int* tmparr=(int*)malloc(sizeof(int) * size);

memcpy(tmparr, arr, size*sizeof(int));

int count = 0;

for (int i = 0; i < size; i ++) {

int j=0;

for (j = 0; j < count; j ++) {

if (arr[i]<tmparr[j]) {

memcpy(tmparr+j+1, tmparr+j, (size-j-1)*sizeof(int));

tmparr[j]=arr[i];

break;

}

}

if (j==count) {

tmparr[j]=arr[i];

}

count ++;

}

memcpy(arr, tmparr, size*sizeof(int));

free(tmparr);

}

// 就地insert

void insertsort2(int* arr, int size) {

for (int i = 0; i < size; i ++) {

for (int j = 0; j < i; j ++) {

if (arr[i] < arr[j]) {

int t = arr[i];

memcpy(arr+j+1, arr+j, (i-j)*sizeof(int));

arr[j]=t;

break;

}

}

}

}

int main(int argc, char *argv[])

{

int arr[] = {5, 3, 6, 1, 2};

int size = sizeof arr/sizeof *arr;

/*bubble3(arr, size);*/

insertsort2(arr, size);

for (int i = 0; i < size; i ++) {

printf("%d, ", arr[i]);

}

return 0;

}

时间: 2024-11-05 06:24:56

排高低:冒泡与插入排序。不要管别人,自己设计的才是自己的。的相关文章

单链表的排序(快排和冒泡实现)以及查找中间结点

//快排,冒泡链表排序 #include<iostream> #include<assert.h> using namespace std; template<class T> struct LinkNode { T _data; LinkNode* _next; LinkNode(const T& x) :_data(x) , _next(NULL) {} }; template<class T> class ListNode { //为了安全性

冒泡以及插入排序算法的改进

冒泡排序 说明:此文中的排序算法数组,第一个数(即0下标)没有作为数据处理(i从1开始),arr[0]用作哨岗,部分排序算法(如插入排序)比较时需要用到 排序思想: 1.假设共有N个数,从头开始,比较相邻的两个数,如果前一个数比后一个数大,则交换位置,否则不变,继续比较. 2.按照这样的方法对数组从0到N-1进行遍历,一轮遍历完,则最后一个数为最大值. 3.N=N-1,按照1,2的思想遍历N-1轮,则数组从大到小排序成功 void Popsort(int arr[],int n)//冒泡排序 {

快排,冒泡排,选择排序,希尔排序

package cn.hncu.dataStruct; public class SortMethods { /* 算法好坏的评价指标(一般只在n值非常大的时候才会考虑,如n取10万): * 1.时间复杂度: 通俗点,就是指程序运行的快慢(时间)---通常用计算机的运算(算术,赋值)次数来代替 * 2.空间复杂度: 占用内存空间的大小---通常用程序中使用了多少变量(栈内存.堆内存),这些变量总共占了多少内存 */ public static void main(String[] args) {

快排和冒泡高质量排序

一.快速排序 (1)排列整数: #include <stdio.h> #include <stdlib.h> #include <string.h>   int com_int(const void *elem1, const void *elem2 ) { return *(int *)elem1 - *(int *)elem2; } int main() { int arr[] = { 1, 3, 5, 7, 2, 4, 6, 8 }; int i = 0; qso

排序:正序冒泡,交错冒泡,插入排序,选择排序,快速排序

1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #include<string.h> 5 const int N=10; //修改随机数据量 6 bool onOroff=1; //数组打印开关:1要打印,0不打印 7 void bubble_sort(int a[],int n) 8 { 9 for(int i=0 ; i<N ; ++i) 10 { 11 for(int j

php实现的冒泡,插入排序,希尔排序,归并排序

<?php/***选择排序也就是冒泡排序,就是基于各个数据之间的对比来排序**/$arr = array(2,1,7,5,8,9,3,4,10,30,28,24);function bubbleSort($arr) {    $len = count($arr);    $k = 0;    for($i=0;$i<$len;$i++){    $k++;        for($j=$i+1;$j<$len;$j++) {            if($arr[$i] > $ar

C语言选择、冒泡、插入排序算法

#include <stdio.h> #pragma mark 选择排序算法 void xuanze_array(int *array, int len) { for (int i = 0; i<len-1; i++) { for (int j = i+1; j<len; j++) { if (array[i]<array[j]) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } } } } #pra

选择 冒泡 快速 插入排序

/** * 演示各种排序法 */package com.test1;import java.util.*;public class Demo5_3 { public static void main(String[] args) { // TODO Auto-generated method stub int len=8; int arr1[]=new int[len]; for(int i=0;i<len;i++) { //让程序随机产生一个1-10000的数 //Math.random()会

冒泡和插入排序

package paixu; public class MaoPaoPaiXu { public static void main( String agrs[]){ /** * 冒泡排序 * */ int[] arr = {23,22,12,56,45}; int temp = -1; for(int i=0;i<arr.length-1;i++) { for(int j=i+1;j<arr.length;j++) { if(arr[i]>arr[j]) { temp = arr[i];