经典算法学习——冒泡排序
? ? ? 冒泡排序是我們學(xué)習(xí)的第一種排序算法。應(yīng)該也算是最簡(jiǎn)單、最經(jīng)常使用的排序算法了。
無(wú)論怎么說(shuō)。學(xué)會(huì)它是必定的。
今天我們就用C語(yǔ)言來(lái)實(shí)現(xiàn)該算法。
演示樣例代碼已經(jīng)上傳至:https://github.com/chenyufeng1991/BubbleSort
算法描寫(xiě)敘述例如以下:
(1)比較相鄰的前后兩個(gè)數(shù)據(jù)。假設(shè)前面數(shù)據(jù)大于后面的數(shù)據(jù),就將兩個(gè)數(shù)據(jù)交換;
(2)這樣對(duì)數(shù)組的第0個(gè)數(shù)據(jù)到N-1個(gè)數(shù)據(jù)進(jìn)行一次遍歷后。最大的一個(gè)數(shù)據(jù)就到了最后一個(gè)位置,也就是下標(biāo)為N-1的位置(沉到了水底)。
(3)N = N-1,假設(shè)N不為0就反復(fù)(1)(2)兩步,否則排序完畢。也就是對(duì)數(shù)組的第0個(gè)數(shù)據(jù)到N-2個(gè)數(shù)據(jù)再次進(jìn)行遍歷;
完整的代碼實(shí)現(xiàn)例如以下:
// // main.c // BubbleSort // // Created by chenyufeng on 16/1/28. // Copyright ? 2016年 chenyufengweb. All rights reserved. //#include <stdio.h>typedef int BOOL; #define true 1 #define false 0int *bubbleSort01(int arr[],int len); void bubbleSort03(int arr[],int len);int main(int argc, const char * argv[]) {int array[7] = {150,111,1000,99,300,10,189};/***指針向后移位;*/// int *p = bubbleSort02(array, 7);//// for (int i = 0; i < 7; i++) {// printf("%d ",*(p+i));// }/*** 能夠使用傳引用的方式,實(shí)現(xiàn)例如以下;這里不須要返回值,直接打印就可以,推薦使用這樣的方式,方便。*/bubbleSort04(array, 7);for (int i = 0; i < 7; i++) {printf("%d ",array[i]);}return 0; }//常規(guī)的冒泡; int *bubbleSort01(int arr[],int len){int temp;for (int i = 0; i < len; i++){for (int j = 1; j < len - i; j++) {if (arr[j - 1] > arr[j]) {temp = arr[j - 1];arr[j - 1] = arr[j];arr[j] = temp;}}}return arr; }//常規(guī)的冒泡,不須要返回值。 void bubbleSort03(int *arr,int len){int temp;for (int i = 0; i < len; i++){for (int j = 1; j < len - i; j++) {if (arr[j - 1] > arr[j]) {temp = arr[j - 1];arr[j - 1] = arr[j];arr[j] = temp;}}} }當(dāng)然也能夠把上面的交換元素的代碼抽取出來(lái)。寫(xiě)成一個(gè)交換函數(shù)swap。
代碼實(shí)現(xiàn)例如以下:
// // main.c // BubbleSort // // Created by chenyufeng on 16/1/28. // Copyright ? 2016年 chenyufengweb. All rights reserved. //#include <stdio.h>typedef int BOOL; #define true 1 #define false 0int *bubbleSort01(int arr[],int len); void swap(int *a,int *b);int main(int argc, const char * argv[]) {int array[7] = {150,111,1000,99,300,10,189};/***指針向后移位;*/// int *p = bubbleSort02(array, 7);//// for (int i = 0; i < 7; i++) {// printf("%d ",*(p+i));// }/*** 能夠使用傳引用的方式。實(shí)現(xiàn)例如以下;這里不須要返回值。直接打印就可以,推薦使用這樣的方式,方便;*/bubbleSort01(array, 7);for (int i = 0; i < 7; i++) {printf("%d ",array[i]);}return 0; }//常規(guī)的冒泡。 int *bubbleSort01(int arr[],int len){int temp;for (int i = 0; i < len; i++){for (int j = 1; j < len - i; j++) {if (arr[j - 1] > arr[j]) {// temp = arr[j - 1]; // arr[j - 1] = arr[j]; // arr[j] = temp;//這里也能夠使用swap交換函數(shù);swap(&arr[j - 1], &arr[j]);}}}return arr; }void swap(int *a,int *b){int temp;temp = *a;*a = *b;*b = temp; }交換類(lèi)排序:借助數(shù)據(jù)元素之間的相互交換進(jìn)行排序的一種方法。如冒泡排序、高速排序。
插入類(lèi)排序:將無(wú)序的各個(gè)元素依次插入到已經(jīng)有序的線(xiàn)性表中。如直接插入排序、希爾排序。
選擇排序:掃描整個(gè)線(xiàn)性表,選出最小的元素。將它交換到表的最前面。然后對(duì)剩下的繼續(xù)相同的方法,直到子表為空。如直接選擇排序、堆排序。
? ? ?說(shuō)明下,冒泡排序的時(shí)間復(fù)雜度為O(n^2),空間復(fù)雜度為O(1).是一種穩(wěn)定的排序。
總結(jié)
以上是生活随笔為你收集整理的经典算法学习——冒泡排序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: day26 re正则表达式
- 下一篇: rhel iptables只允许限定IP