【C語言】氣泡排序與快速排序
氣泡排序
基本思想
對有n個記錄的序列進行氣泡排序,首先將第一個數字與第二個數字進行比較,若為逆序,則將兩個數字的順序交換。然後比較第二個數字與第三個數字,若為逆序,則將兩個數字的順序交換…依此類推,經過第一輪排序後,最大的數字將“下沉”到最後,每趟的比較次數依次減少。經過n-1輪排序,將得到一個遞增的序列。
空間複雜度:O(1)
時間複雜度:O(n^2)
穩定性:穩定
程式碼實現
n個記錄總共要進行n-1趟排序,第i趟的比較次數為n-i次。可以使用雙層迴圈,外層迴圈控制第幾輪排序,內層控制每一輪比較的次數。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
void Input(); //輸入陣列
void Output(); //輸出陣列
void BubbleSort(); //氣泡排序
int arr[MAXSIZE];
int count = 0;
//氣泡排序
void BubbleSort(){
int i ,j ,temp;
for ( i = 0; i < count; i++)
{
for ( j = 0; j < count-i; j++)
{
if (arr[j] > arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
//輸入函式
void Input(){
int x,i;
char s;
printf("please input less than 100 numbers, end with enter:\n");
for (i = 0; s != '\n'; i++)
{
scanf("%d",&arr[i]);
s = getchar();
count++;
}
}
//輸出函式
void Output(){
printf("sorted numbers:\n");
for (int i = 1; i <= count; i++){
printf("%d\t",arr[i]);
}
printf("\n");
}
int main(){
Input();
BubbleSort();
Output();
system("pause");
return 0;
}
執行結果:
快速排序
基本思想
快速排序是從氣泡排序改進而得的一種“交換”排序方法。採用的是一種分治的策略。
-
先從數列中取出一個數作為基準數(稱為樞軸)。
-
將比基準數大的數全放到它的右邊,小於或等於基準數的全放到它的左邊。
-
再對左右兩部分重複第(2)步,直到各區間只有一個數,達到整個序列有序。
空間複雜度:最好:O(n lb n),最壞:O(n)
時間複雜度:平均:O(n lb n),最壞:O(n^2)
穩定性:不穩定
程式碼實現
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
void Input(); //輸入陣列
void Output(); //輸出陣列
int Partition(int low ,int high);//一趟快速排序排
void QuikSort(int s, int e); //快速排序
int arr[MAXSIZE];
int count = 0;
//一趟快排
//定義一個high,low,key(記錄樞軸的值)
//最後將樞軸移到正確位置,返回樞軸的位置
int Partition(int low ,int high){
arr[0] = arr[low]; //arr[0]記錄樞軸,待排序列從arr[1]開始
while (low < high)
{
while(low < high&&arr[high] >= arr[0])
--high;
arr[low] = arr[high];
while (low < high&&arr[low] <= arr[0])
++low;
arr[high] = arr[low];
}
arr[low] = arr[0];
return low; //返回樞軸的位置
}
//快排(遞迴呼叫)
void QuikSort(int s,int e){
if (s < e) //s與e是待排序區域的上下界
{
int keyPosition = Partition(s,e); //對待排序列進行一次劃分,並返回樞軸位置
QuikSort(s,keyPosition-1); //對左側子序列遞迴排序
QuikSort(keyPosition+1,e); //對右側子序列遞迴排序
}
}
//輸入函式
void Input(){
int x,i;
char s;
printf("please input less than 100 numbers, end with enter:\n");
for (i = 1; s != '\n'; i++)
{
scanf("%d",&arr[i]);
s = getchar();
count++;
}
}
//輸出函式
void Output(){
printf("sorted numbers:\n");
for (int i = 1; i <= count; i++){
printf("%d\t",arr[i]);
}
printf("\n");
}
int main(){
Input();
QuikSort(1,count);
Output();
system("pause");
return 0;
}
執行結果:
相關文章
- 排序:氣泡排序&快速排序排序
- c語言初學者氣泡排序C語言排序
- C語言之氣泡排序C語言排序
- 氣泡排序、歸併排序與快速排序比較排序
- 用Java語言寫氣泡排序Java排序
- 氣泡排序與選擇排序排序
- 排序——氣泡排序排序
- Go實現氣泡排序和快速排序Go排序
- 9. 氣泡排序,以及如何優化氣泡排序,氣泡排序屬於插入排序排序優化
- 氣泡排序排序
- 淺析氣泡排序-c++排序C++
- PHP 常見4種排序 氣泡排序、選擇排序、插入排序、快速排序PHP排序
- js氣泡排序JS排序
- JavaScript氣泡排序JavaScript排序
- 氣泡排序1排序
- 氣泡排序-fusha排序
- 氣泡排序演示排序
- Shell氣泡排序排序
- d氣泡排序排序
- 容器氣泡排序排序
- 氣泡排序法排序
- 氣泡排序(Java)排序Java
- Python 氣泡排序Python排序
- 排序演算法--氣泡排序排序演算法
- 排序演算法__氣泡排序排序演算法
- 排序演算法–氣泡排序排序演算法
- 選擇排序和氣泡排序排序
- 【排序】氣泡排序(待補充)排序
- python實現氣泡排序、插入排序以及快速排序演算法Python排序演算法
- 【JS面試向】選擇排序、桶排序、氣泡排序和快速排序簡介JS面試排序
- c語言 - 模仿qsort的功能實現一個通用的氣泡排序C語言排序
- 演算法之常見排序演算法-氣泡排序、歸併排序、快速排序演算法排序
- 氣泡排序 插入排序 快排排序
- 淺析氣泡排序排序
- 陣列氣泡排序陣列排序
- Python_氣泡排序Python排序
- 氣泡排序筆記排序筆記
- 氣泡排序(python版)排序Python