1. 程式人生 > >C語言實現直接插入排序,氣泡排序,選擇排序,希爾排序,快排

C語言實現直接插入排序,氣泡排序,選擇排序,希爾排序,快排

     直接插入演算法,每次將未排序的第一個元素插入到前半部分以及排好序的元素中。關鍵是要在已排好的部分進行移位操作。
//直接插入排序演算法
void InsertSort(int a[],int n) {
	for (int i = 1; i < n; i++) {
		if (a[i] < a[i - 1]) {
			int j = i - 1;
			int tmp = a[i];
			while (tmp < a[j]) {
				a[j + 1] = a[j];
				j--;
			}
			a[j + 1] = tmp;
		}
	}
}

      冒泡演算法,最簡單就是不加入識別符號的,進行n-1次外迴圈,加入識別符號後,有可能經過前幾次後就已經有序了,此時就可以跳出外迴圈了。

//冒泡演算法,沒有改進的
void BubbleSort1(int a[],int n) {
	for (int i = 0; i < n-1; i++) {
		for (int j = i ; j < n-1; j++) {
			if (a[j + 1] < a[j]) {
				int tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
			}
		}
	}
}

//冒泡演算法,加入交換標誌符
void BubbleSort2(int a[], int n) {
	for (int limit = n - 1; limit > 0; limit--) {
		bool flag = false;
		for (int j = 0; j < limit; j++) {
			if (a[j + 1] < a[j]) {
				int tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
				flag = true;
			}
		}
		if (!flag) break;
	}
}

      選擇排序演算法,每次從剩下的未排序的部分挑選出最小值,和第一個元素交換位置。

//選擇排序法
void SelectSort(int a[], int n) {
	for (int i = 0; i < n - 1; i++) {
		int key,tmp;
		key=i;
		for (int j = i+1; j < n-1; j++) {
			if (a[j] <a[key]) {
				key= j;
			}
		}
		if (key != i) {
			tmp = a[key];
			a[i] = a[key];
			a[key] = tmp;
		}
	}
}

    希爾排序。希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量的逐漸減少,每組包含的關鍵詞越來越多,當增量減少1時,元素被封為1組,演算法變終止。

//希爾排序法
//輔助函式,子序列直接插入排序法
void ShellInsertSort(int a[], int n, int gap) {
	for (int i = gap; i < n; i++) {
		if (a[i] < a[i - gap]) {
			int j = i - gap;
			int tmp = a[i];
			while (tmp < a[j]) {
				a[j + gap] = a[j];
				j -= gap;
			}
			a[j + gap] = tmp;
		}
	}
}

void ShellSort(int a[], int n) {
	int gap = n / 2;
	while (gap >= 1) {
		ShellInsertSort(a, n, gap);
		gap = gap / 2;
	}
}

       快速排序演算法。快速排序演算法的思想是,先選一個“標尺”, 用它把整個佇列過一遍篩子, 以保證其左邊的元素都不大於它,其右邊的元素都不小於它。這樣,排序問題就被分割為兩個子區間。 再分別對子區間排序就可以了。

//快速排序法
//輔助函式1:交換元素
void swap(int *a, int *b) {
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

//輔助函式2:找到陣列的分給點
int Partition(int a[], int low, int high) {
	int privotkey = a[low];
	while (low < high) {
		while (low<high && a[high]>privotkey) --high;
		swap(&a[low], &a[high]);
		while (low < high && a[low] < privotkey) ++low;
		swap(&a[low], &a[high]);
	}
	return low;
}

void QuickSort(int a[], int low, int high) {
	if (low < high) {
		int privot = Partition(a, low, high);
		QuickSort(a, low, privot - 1);
		QuickSort(a, privot + 1, high);
	}
}
驗證
#include "stdafx.h"
#include<stdio.h>
using namespace std;

//各種排序演算法
int main()
{
	int a[10] = { 0, 2, 1, 4, 5, 3, 6 ,7, 8, 9 };
	//ShellSort(a, 10);
	QuickSort(a, 0, 9);
	for (int j = 0; j < 10; j++) {
		printf("%d\t", a[j]);
	}
	printf("\n");
	return 0;
}




相關推薦

C語言實現直接插入排序氣泡排序選擇排序排序

     直接插入演算法,每次將未排序的第一個元素插入到前半部分以及排好序的元素中。關鍵是要在已排好的部分進行移位操作。//直接插入排序演算法 void InsertSort(int a[],int n) { for (int i = 1; i < n; i++) {

資料結構之---C語言實現直接插入排序

wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------

資料結構 C語言實現直接插入排序

一、直接插入排序簡介  每次從無序表中取出第一個元素,把它插入到有序表的合適位置,使有序表仍然有序。  第一趟比較前兩個數,然後把第二個數按大小插入到有序表中; 第二趟把第三個資料與前兩個數從前向後掃描,把第三個數按大小插入到有序表中;依次進行下去,進行了(

C語言實現直接插入排序—從小到大

#include void insert_Sort(int array[],int len) { int insertNum; for (int i=0; i0 && insertNu

(排序演算法)linux c語言實現二分插入排序演算法(簡化版本的插入排序演算法)

 二分插入演算法是在已經排序好的序列裡插入一個元素,是穩定的演算法,關鍵詞是折中。 比如說我要在12345678910裡插入一個3,那麼我先看看中間的數比3大,還是比3小,要是比3大,我就去後一半,如果是比3小,我就去前一半,現在進入某個一半後,再做如此操作,最後將其他的元素依次往後挪

排序演算法c語言描述---直接插入排序

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C語言實現折半插入演算法

1 #include <stdio.h> 2 int BInsertSort(int array[],int left,int right){ //接收主函式呼叫語句中的實參傳到這裡的形參裡 3 int low,high,mid; 4 int temp; 5

單鏈表的C語言實現插入刪除演算法

什麼是單鏈表?   由於順序表在插入和刪除是需要做大量的元素移動工作,而且需要連續的物理空間,因此其缺點是十分明顯的,為了解決這一問題,不需要預先分配連續的記憶體地址空間、插入刪除元素不需要做大量移動工作的連結串列出現了。但解決問題的同時也擁有自己的缺點,即不能隨機存取。   在連結串列中,每個

今天定個小目標C語言實現三子棋的玩法。裡面有精彩情景故事幫助你更理解程式碼內容不進來了解一下嗎?(內附程式碼)

  如標題所示,今天我們要用C語言來實現三子棋的遊戲。相信大家都玩過這個遊戲。我們來回憶一下游戲步驟。   一、今天你在家裡看書,你的朋友小紅邀請你和她一起玩三子棋。這時你有兩個選擇。     1.接受她的邀請,在玩遊戲的同手,促進你們的感情。     0.殘忍

C語言實現直接法解線性方程組

  利用線性方程組初等變換中的一種變換,即用一個不為零的數乘以一個方程加至 另一個方程,使方程組變成同解的上三角方程組,然後再自上而下對上三角方程組求解。 二.兩個過程 順序高斯消去法分為“消去”和“回代”兩個過程。 三.一般求解過程 四.使用條件 因為這裡涉及到對角線元素的除法

C語言實現:一個數組中只有兩個數字是出現一次其他所有數字都出現了兩次。

思路:異或陣列中的每一個數,最終出現的結果是兩個只出現一次數字的異或結果,,因為兩個陣列不一樣,所以異或結果不為0,二進位制結果有一個是1.在結果中找到第一個為1的位置,記為n,然後陣列右移n位,為1,為0,分別輸出兩個數#include <stdio.h> #i

【演算法】排序04——程式碼簡約而不簡單的排序(含程式碼實現

  1、希爾排序的效能簡介 希爾排序是插入排序的改進型,也因此,它的空間複雜度是O(1)。不過有趣的是,希爾排序的平均時間複雜度計與其增量有關,算起來較為複雜,dalao們的研究認為是O[n^(1.3 ~ 2)]之間。 其實相比於快排、歸併、堆排這些平均之間複雜度為O [ nlog(n) ]的線性

(資料結構排序的實驗四)快速冒泡簡單選擇直接插入排序c語言實現!!

<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18p

氣泡排序C語言實現

氣泡排序是一種穩定排序,時間複雜度平均為O(n^2),最好的時間複雜度為O(n),最壞為O(n^2)。   排序時每次只比較當前元素與後一個 元素的大小,如果當前元素大於後一個元素,則交換,如此迴圈直到隊尾,每輪排序都可以保證將當前排序下最大的元素送到未排序部分的隊尾。 有n個元素要排列,故要

插入排序C語言實現

插入排序是穩定排序,時間複雜度最低為O(n),最高為O(n^2),平均為O(n^2)。   插入排序是將陣列分為兩部分,一部分已經排好序,另一部分未排好序,每次從未排好序的部分取第一個元素插入到已經排好序的部分正確的位置,如此迴圈n-1次。 就好像你手裡有十張牌,左手有一張,右手有九張。每次從

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

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

各種排序演算法的場景以及c++實現插入排序排序氣泡排序快速排序選擇排序歸併排序

對現有工作並不是很滿意,所以決定找下一個坑。由工作中遇到排序場景並不多,大都是用氣泡排序,太low,面試又經常問到一些排序演算法方面的東西。剛好讓小學妹郵的資料結構也到了。就把各種排序演算法重新總結一下,以作留存。 排序分為內部排序和外部排序,內部排序是在記憶體中排序。外

C語言入門:插入排序(程式碼實現而不是排序方法闡述)

適用於理解排序方法思路而不清楚程式碼如何實現的C語言入門者 簡易流程圖: //插入排序,這裡以6個數的排序為例 #include <stdio.h> int main (void) { int a[6],i,j,mid,k; p

經典排序演算法氣泡排序選擇排序直接插入排序排序快速排序歸併排序二分查詢。原理及python實現

1.氣泡排序 氣泡排序 1.比較相鄰的元素,如果第一個比第二個大(升序),就交換他們兩個 2.對每一對相鄰的元素做同樣的工作,從開始到結尾的最後一對 這步做完後,最後的元素會是最大的數 3.針對所有的元素重複以上的步驟,除了最

氣泡排序詳細過程c語言實現

此時按道理應該開始第四趟比較,也就是比較4和5,但是我們通過第三趟比較後可以知道,順序已經排好了,所以再次比較,只會增加演算法的時間,降低演算法的效能,所以我們應該設定一個標記變數flag,當比較沒有交換後,我們可以跳出迴圈,列印結果。