排序演算法大總結,冒泡 插入 歸併 選擇和快速排序

2021-10-11 20:30:23 字數 2907 閱讀 9869

#include

#include

#include

#include

//這裡定義乙個交換巨集

#define swap(a, b)

//通過test巨集將棧中的陣列拷貝到臨時的堆陣列中,在堆中對陣列進行排序並列印結果,這樣做的好處就是不會改變原有陣列的形式

#define test(arr,n,func,args...)

/*-----------下面列出了多種排序演算法的**-----------*/

/******************穩定排序演算法****************/

/******insert_sort 氣泡排序(以下都已從小到大為準)******/

/******演算法時間複雜度為o(n^2)******/

void

insert_sort

(int

*num,

int n)

//可以想象為插隊,從最後乙個開始插隊,遇到比自己高的就往他前面走(也就是swap)

}return;}

/********bubble_sort 氣泡排序***********/

/********演算法時間複雜度為o(n^2)***********/

void

bubble_sort

(int

*num,

int n)

}return;}

/********merge_sort 歸併排序**************/

/********演算法時間複雜度為o(n*logn)***********/

void

merge_sort

(int

*num,

int l,

int r)

if(r-l ==0)

return;}

int mid =

(r+l)

>>1;

merge_sort

(num,l,mid)

;merge_sort

(num,mid+

1,r)

;int

*temp =

(int*)

malloc

(sizeof

(int)*

(r-l+1)

);int p1 =l ,p2 = mid +

1,k =0;

// int *p2 = &num[mid+1];

for(

int i =

0; i < r-l+

1; i++

)else

}memcpy

(num+l,temp,

sizeof

(int)*

(r-l+1)

);free

(temp)

;return;}

void

randinit

(int

*arr,

int n)

return;}

void

output

(int

*num,

int n)

printf

("]\n");

}/********************************非穩定排序******************************************/

/***********選擇排序*************/

/***************演算法複雜度為o(n^2),它與氣泡排序比較相似,在大部分情況下它所花費的時間要小於氣泡排序***************/

/*******因為氣泡排序是比較相鄰兩個元素的大小如果不滿足就交換,而選擇排序只需要標記最小的那位,直到比較完最後才交換一次,交換次數遠遠小於氣泡排序******/

/****兩者的相似之處都是找到未排序去的最小值,然後將它排入到已排序區的後面,只不過乙個是相鄰兩個比較大小並交換,乙個是先找出最小值在交換,乙個的已排序區在右邊,乙個在左邊****/

/****氣泡排序是將最大值或最小值擠到最右邊,而選擇排序是將最大值或最小值交換到最左邊***/

void

select_sort

(int

*num,

int n)

swap

(num[i]

, num[ind]);

//將這一輪找到的最小值與待排序區最左邊的進行交換

}return;}

/************快速排序**************/

/*******************演算法複雜度為o(n*logn),但是又的情況會變為o(n^2)******************/

/**********快速排序其實和歸併排序有相似之處,都是用到了分支分治思想,將大問題化為乙個乙個小問題************/

/*******不同點是,歸併先是分然後利用遞迴的回溯先將分好的乙個個小分支的順序排好在回溯時合併為大分支,

而快排是利用在迭代時入棧先將大分支排得基本有序在分為小分支繼續往下排序******/

void

quick_sort

(int

*num ,

int l,

int r)

num[x]

= z;

//將基準值移到x與y相遇的位置

quick_sort

(num, l, x -1)

;//加一和減一中間基準值不需要在排序

quick_sort

(num, x +

1, r)

;return;}

intmain

(int argc,

char

const

*ar**)

冒泡,選擇,插入排序演算法 總結

之前一直都沒有怎麼注意簡單演算法的編寫,現在重寫翻閱了下資料,才慢慢熟悉。package com.klay.sort public class klay int arr1 int arr2 bubbo arr for int i 0 i arr.length i system.out.println...

選擇 冒泡 插入排序演算法總結

本文做的排序都是預設公升序排序,即從小到大,此為大前提 l 2,5,3,6,1,4,0,9,18,11,15,12 選擇排序 依次拿乙個元素 從第二個元素開始 和第乙個位置元素比較,如果比第乙個元素小就交換位置,這樣第一次迴圈結束,最小的數就放在了第乙個,以此類推 第一層迴圈確定元素要放的位置,所以...

排序演算法 插入 選擇 冒泡 快排 歸併

可以找一些帖子理解下幾類排序演算法或者聽下陳越姥姥在mooc上的資料結構 選擇類排序 交換類排序 歸併排序 基數排序 拓撲排序 從待排序的n個記錄中的第二個記錄開始,依次與前面的記錄比較並尋找插入的位置,每次外迴圈結束後,將當前的數插入到合適的位置。void sort insert int a,in...