用C語言解決快速排序問題
快速排序分為三個部分:1,分解即分為三段 2,遞迴求解:通過遞迴進行排序 3,合併:將排好序的區間進行合併
遞迴進行排序
即:void QuickSort(){
if(p<r){
int q = Partition(Type )
QuickSort(a , p , q - 1)
QuickSort(a , q + 1 , r)
//分成了三段
}
}
Partition是通過基準元素對陣列a進行劃分的 是排序演算法的關鍵。
演算法對a[P:R]進行劃分時,通過以元素X=a[ p ]作為劃分的基準。
分別從左右兩端開始拓展兩個區域,再拓展兩個區間左邊區間的小於基準元素,右邊區間的大於基準元素
其中區間大小不斷減小,一直迴圈到左右區間裡元素接近
資料結構中原始碼如下:
#include<stdio.h>
void quickSort1(int* root, int low, int high)
{
int pat = root[low];
if (low<high)
{
int i = low, j = high;
while (i<j)
{
while (i<j&&root[j]>pat)
j--;
root[i] = root[j];
while (i<j&&root[i]<pat)
i++;
root[j] = root[i];
}
root[i] = pat;
quickSort1(root, low, i - 1);
quickSort1(root, i + 1, high);
}
}
int main()
{
/*int a[8]={4,2,6,7,9,5,1,3}; */
int n;
printf("請輸入要排序的數字個數");
scanf_s("%d", &n);
int *p = new int[n];
//delete[]p;
for (int i = 0; i<n; i++)
{
printf("p[%d]=", i);
scanf_s("%d", &*(p + i));
}
printf("\n");
quickSort1(p, 0, n - 1);
//quickSort2(a,0,7);
int i;
printf("進行輸出:\n");
for (i = 0; i<n; i++)
{
printf("a[%d]:%d ", i, p[i]);
}
printf("\n");
return 0;
}
按照演算法書上的寫法
#include<stdio.h>
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int Partition(int* a, int low, int high){
int i = low, j = high + 1;
int x = a[low];
while (true){
while (a[++i] < x&&i < high);
while (a[--j]>x);
if (i >= j)break;
swap(a[i], a[j]);
}
a[low] = a[j];
a[j] = x;
return j;
}
void quickSort1(int* root, int low, int high)
{
if (low < high){
int q = Partition(root, low, high);
/*int pat = root[low];
if (low<high)
{
int i = low, j = high;
while (i<j)
{
while (i<j&&root[j]>pat)
j--;
root[i] = root[j];
while (i<j&&root[i]<pat)
i++;
root[j] = root[i];
}
root[i] = pat;*/
quickSort1(root, low, q - 1);
quickSort1(root, q + 1, high);
}
}
int main()
{
/*int a[8]={4,2,6,7,9,5,1,3}; */
int n;
printf("請輸入要排序的數字個數");
scanf_s("%d", &n);
int *p = new int[n];
//delete[]p;
for (int i = 0; i<n; i++)
{
printf("p[%d]=", i);
scanf_s("%d", &*(p + i));
}
printf("\n");
quickSort1(p, 0, n - 1);
//quickSort2(a,0,7);
int i;
printf("進行輸出:\n");
for (i = 0; i<n; i++)
{
printf("a[%d]:%d ", i, p[i]);
}
printf("\n");
int k;
scanf_s("%d", &k);
return 0;
}
不需要考慮檔名 我的檔名寫錯了