1. 程式人生 > >【排序】氣泡排序、選擇排序、插入排序、希爾排序

【排序】氣泡排序、選擇排序、插入排序、希爾排序

#include<iostream>
using namespace std;

void swap(int* a, int* b){
	int temp = *a;
	*a = *b;
	*b = temp;
}

void bubble_sort1(int nums[],int len){
	for (int i = 0; i < len; i++){
		for (int j = len - 1; j>i; j--){
			if (nums[j] < nums[j - 1])
				swap(&nums[j], &nums[j - 1]);
		}
	}
}
void bubble_sort2(int nums[], int len){
	bool flag = true;	//flag用來作為標記
	for (int i = 0; i < len&&flag; i++){ //若flag為true說明有過資料交換,否則停止迴圈 
		flag = false;
		for (int j = len - 1; j>i; j--){
			if (nums[j] < nums[j - 1]){
				swap(&nums[j], &nums[j - 1]);
				flag = true;
			}
		}
	}
}

void selection_sort(int nums[], int len){
	int min;
	for (int i = 0; i < len; i++){
		min = i;
		for (int j = i + 1; j < len; j++){
			if (nums[min]>nums[j])
				min = j;
		}
		if (i != min)
			swap(&nums[i], &nums[min]);
	}
}

void insert_sort(int nums[], int len){
	for (int i = 1; i < len; i++){
		int j;
		int temp = nums[i];
		for (j = i - 1; j >= 0 && nums[j]>temp; j--)
			nums[j + 1] = nums[j];//記錄後移 
		nums[j + 1] = temp;//插入到正確位置 
	}
}

void shell_sort(int nums[], int len){
	int increment = len / 2; //增量序列 
	while (increment >= 1){
		for (int i = increment; i < len; i++){
			int j;
			int temp = nums[i];
			//對距離為increment的元素組進行插入排序
			for (j = i - increment; j >= 0 && nums[j]>temp; j -= increment)
				nums[j + increment] = nums[j];
			nums[j + increment] = temp;
		}
		increment /= 2; //減小增量
	}
}

void print_array(int nums[], int len){
	for (int i = 0; i < len; i++)
		cout << nums[i] << ' ';
	cout << endl;
}
int main(){
	int nums1[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
	int len1 = sizeof(nums1) / sizeof(int);
	bubble_sort1(nums1, len1);
	print_array(nums1, len1);

	int nums2[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
	int len2 = sizeof(nums2) / sizeof(int);
	bubble_sort2(nums2, len2);
	print_array(nums2, len2);

	int nums3[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
	int len3 = sizeof(nums3) / sizeof(int);
	selection_sort(nums3, len3);
	print_array(nums3, len3);

	int nums4[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
	int len4 = sizeof(nums4) / sizeof(int);
	insert_sort(nums4, len4);
	print_array(nums4, len4);

	int nums5[] = { 9, 1, 5, 8, 3, 7, 4, 6, 2 };
	int len5 = sizeof(nums5) / sizeof(int);
	shell_sort(nums5, len5);
	print_array(nums5, len5);

	return 0;
}

相關推薦

排序氣泡排序選擇排序插入排序排序

#include<iostream> using namespace std; void swap(int* a, int* b){ int temp = *a; *a = *b; *b = temp; } void bubble_sort1(int

資料結構直接插入排序詳細解釋排序直接選擇排序選擇排序

一、直接插入排序 將一個數組進行直接插入排序,每次取陣列中一個數A儲存起來,和此數下標之前已經排好的陣列進行比較(第一次因為前面沒有數,直接取陣列第二個數),假設需要升序數列,如果A數小於要比較的數,就繼續往陣列中更小下標的數比較(在這個過程中因為A數已經儲存起

C#氣泡排序隱式和顯式轉換函式及異常處理

一、普通氣泡排序: C#中常見的排序方法有:氣泡排序,快速排序,插入排序,選擇排序、堆排序以及歸併排序。雖然還沒學習過,但是也有耳聞,就先把它們先歸類。今天主要講這裡面最常見的氣泡排序。 【概念】 氣泡排序也就是講一組需要排序的數,進行從小到大,或從大到小的排列。計算機

演算法氣泡排序選擇排序的遞迴實現

1 氣泡排序 1 氣泡排序: void bubbleSort(int *data,int start,int end) { if (start < end) { int temp = 0; int length = end -

算法拾遺(java描寫敘述)--- 插入排序(直接插入排序排序

ecan itblog insert med image java程序 can rip title 插入排序基本思想 每次將一個待排序的記錄按其keyword大小插入到前面已經拍好序的子文件的適當位置,直到全部記錄插入完畢為止。 直接插入

排序演算法(直接插入氣泡排序選擇排序快速排序排序排序歸併排序

main函式 int main() { int data[] = {1,2,6,3,4,7,7,9,8,5}; //bubble_sort(data,10); //select_sort(data,10); Insert_Sort(data,10); fo

初探 —— 氣泡排序

  普通的氣泡排序 ● 氣泡排序是一種交換排序。  什麼是交換排序呢? 交換排序:兩兩比較待排序的關鍵字,並交換不滿足次序要求的那對數,直到整個表都滿足次序要求為止。  ● 氣泡排序(Bubble Sort)是一種簡單的排序演算

筆記氣泡排序

/*  *    內容:    氣泡排序法  *    作者:    wolves_liu  *    日期: 

JZOJ5931氣泡排序

description 小 S 開始專注於研究⻓度為 n 的排列,他想知道,在你運氣足夠好的情況下(即每次氣泡排序的交換次數都是可能的最少交換次數,彷彿有上帝之手在操控),對於一個等概率隨機的長度為n 的排列,進行這樣的氣泡排序的期望交換次數是多少? analysis

BZOJ5416UOJ394NOI2018氣泡排序

【題目連結】 BZOJ UOJ 【思路要點】 首先,當且僅當一個排列不含有長度為 33 的下降子序列,氣泡排序的交換次數取到下界。 證明:一個排列不含有長度為 33 的下降子序列等價於不存在一個位置前面有更大的數並且

3. 排序通常有多種演算法,如氣泡排序插入排序選擇排序排序歸併排序快速排序,請選擇任意2種用java實現 [分值:20] 您的回答:(空) (簡答題需要人工評分)

3. 排序通常有多種演算法,如氣泡排序、插入排序、選擇排序、希爾排序、歸併排序、快速排序,請選擇任意2種用java實現  [分值:20] 您的回答:(空)  (簡答題需要人工評分) package com.interview; /** * 各種排序演算法 */

C語言中常用排序演算法(氣泡排序選擇排序插入排序排序快速排序排序)實現比較

以下程式在win10 X64位作業系統,使用VS2017執行驗證可行 排序是非常重要且很常用的一種操作,有氣泡排序、選擇排序、插入排序、希爾排序、快速排序、堆排序等多種方法。 例項1 冒泡法排序 1.前言: 陣列中有N個整數,用冒泡法將它們從小到大(或從大到小)排序。冒泡法

[筆記氣泡排序

/*  *    內容:    氣泡排序法  *    作者:    wolves_liu  *    日期:    2018.3.21  *    參考:    大話資料結構  */   // 線性表順序儲存結構 #define        Max        20 t

排序演算法——排序快速排序

希爾排序 演算法描述: 1)先取定一個小於 n 的整數 gap1 作為第一個增量,把整個序列分成 gap1 組。 所有距離為 gap1 的倍數的元素放在同一組中,在各組內分別進行排序(分組內採用直接插入排序或其它基本方式的排序)。 2)然後取第二個增量gap2<gap1,重複上述的

演算法與資料結構(十三) 氣泡排序插入排序排序選擇排序(Swift3.0版)

本篇部落格中的程式碼實現依然採用Swift3.0來實現。在前幾篇部落格連續的介紹了關於查詢的相關內容, 大約包括線性資料結構的順序查詢、折半查詢、插值查詢、Fibonacci查詢,還包括數結構的二叉排序樹以及平衡二叉樹的構建與查詢,然後還聊了雜湊表的構建與查詢。接下來的幾篇部落格中我們就集中的聊一下常見的集中

演算法氣泡排序(從小到大) 排序範圍(0~n-1)n為陣列元素個數

  今天要談的是基本排序演算法中的氣泡排序。除了氣泡排序,基本排序演算法還包括:選擇排序、插入排序。   插入排序演算法的思想也是很簡單的,它把排序過程模擬成了從水底冒氣泡的過程。一趟排序過程結束後,

Python八大演算法的實現,插入排序排序氣泡排序快速排序直接選擇排序排序歸併排序基數排序

1、插入排序 描述 插入排序的基本操作就是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序,時間複雜度為O(n^2)。是穩定的排序方法。插入演算法把要排序的陣列分成兩部分:第一部分包含了這個陣列的所有元素,但將最後一

排序演算法整理:氣泡排序排序插入排序歸併操作快速排序排序選擇排序

SortUtils.java package prms.utils.sort; import java.util.Arrays; /** * @ClassName: SortUtils * @Description: &lt;p&gt; 排序演算法 工具類 &l

BZOJ5416NOI2018氣泡排序(動態規劃)

【BZOJ5416】【NOI2018】氣泡排序(動態規劃) 題面 BZOJ 洛谷 UOJ 題解 考場推出了就是兩個上升子序列,並且最長下降子序列長度不超過\(2\)。。。然後大力暴力狀壓\(dp\)混了\(44\)分。。。這個結論並不是很難證明,考慮一下氣泡排序的過程就好了。 實際上\(O(n^2)\

排序演算法(氣泡排序選擇排序插入排序歸併排序快速排序排序

氣泡排序           核心:                       相鄰元素兩兩比較,大的往後放。第一次比較完畢以